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 =)