Ajax.Updater & Only get, put, and delete requests are allowed.

Hey everyone,

I'm using the Ajax tabs method/example seen at: http://actsasflinn.com/Ajax_Tabs/index.html

It renders partials without a problem but when I need it to render

ActionController::MethodNotAllowed
Only get, put, and delete requests are allowed.

/Library/Ruby/Gems/1.8/gems/actionpack-2.3.2/lib/action_controller/
routing/recognition_optimisation.rb:64:in `recognize_path'
/Library/Ruby/Gems/1.8/gems/actionpack-2.3.2/lib/action_controller/
routing/route_set.rb:437:in `recognize'
/Library/Ruby/Gems/1.8/gems/actionpack-2.3.2/lib/action_controller/
routing/route_set.rb:432:in `call'

running rake routes I can see:
GET /manage/new(.:format)
{:controller=>"manage", :action=>"new"}

and if I access the page on it's own (root/manage/new) everything
works fine.

Any recommendations on how to get the desired content loaded?

thanks,
bp

Quoting brianp <brian.o.pearce@gmail.com>:

Hey everyone,

I'm using the Ajax tabs method/example seen at: http://actsasflinn.com/Ajax_Tabs/index.html

It renders partials without a problem but when I need it to render
from :controller => 'manage', :action => 'new' I receive:

ActionController::MethodNotAllowed
Only get, put, and delete requests are allowed.

The AJAX code is making a POST request. Change the routing to allow POSTs or
change the template or RJS to make a GET request (probably add ':method =>
:get') to parameter list. If the action does not alter the state, use the
former, otherwise use the latter. E.g., is it okay if a search engine spider
invokes the 'new' action? From the name, I'd guess not. So change the
routing to allow or even require POST requests.

HTH,
  Jeffrey

Hey Jeffery,

thanks for the quick reply.

I had a good feeling it was trying to make a post request.

I did try changing the :method => :post but this actually chokes the
method altogether. I get no response at all.

And the other option for changing my routing I'm not sure I know how
to do.

My manage related routes are currently:
map.resources :manage
map.resources :manage, :collection => { :available => :get }

How would I go about forcing :new to be :post ?

i tried something like:
map.resources :manage, :collection => { :new => :post } but this caues
the sever now to run.

Brian,

You are running into Rails/RESTful convention. In those conventions, the
new action is a GET that returns the form for a new object. The create action
expects a POST with the data for the new object. If this is not the semantics
of your app or controller, either don't use 'map.resources' which does conform
to the Rails/RESTful way, or change your actions and routes.

So what does your 'new' action do?

Jeffrey

Quoting brianp <brian.o.pearce@gmail.com>:

The 'new' action creates 3 empty models and displays the form to fill
in the properties for the 3 new objects (all from 1 form).

Create is followed from new to save the objects to the db etc via post
as expected.

So I suppose the best idea would be to find a way to make the
Ajax.Updater run via :get instead of :post. So I may keep my proper
RESTful resources.

The script for the Ajax.updater is:

function reloadPane(pane, src) {
  new Ajax.Updater(pane, src, {asynchronous:1, evalScripts:true,
onLoading:function(request){pane.innerHTML='<img alt="Wait" src="/
images/spinner.gif" style="vertical-align:-3px" /> Loading...'}})
}

method:'delete'

I tried using:
function reloadPane(pane, src) {
  new Ajax.Updater(pane, src, {asynchronous:1, evalScripts:true,
method:delete, onLoading:function(request){pane.innerHTML='<img
alt="Wait" src="/images/spinner.gif" style="vertical-align:-3px" />
Loading...'}})
}

This didn't work but just now I found an example with:
method:'delete' . Maybe the lack of quotes is what killed the script.
I'll try that as soon as I get home and post back.

Thanks for the help Jeffrey!

Brian,
  Sounds good.

Jeffrey

Quoting brianp <brian.o.pearce@gmail.com>:

And for anyone following this thread with the same problem, by
method:'delete' i mean method:'get' lol I copy & pasted from an
example.

function reloadPane(pane, src) {
  new Ajax.Updater(pane, src, {method:'get', asynchronous:1,
evalScripts:true, onLoading:function(request){pane.innerHTML='<img
alt="Wait" src="/images/spinner.gif" style="vertical-align:-3px" />
Loading...'}})
}

Makes the function work like desired. Now i just have to change my
render layout so it doesn't load the entire page layout inside the
container =)