2011-03-31 10 views
5

En mi config/routes.rb que tengo:rieles simples 3 Ruta está fallando - No hay ruta coincide

post "portal_plan_document/update" 

rutas rastrillo confirma esto:

$ rake routes 
portal_plan_document_update POST /portal_plan_document/update(.:format) {:controller=>"portal_plan_document", :action=>"update"} 
.... 

En mi código que tengo:

<%= form_for @plan_doc, 
    :url => portal_plan_document_update_path, 
    :method => "POST", :remote => true do |f| %> 

En mi archivo de registro que veo:

Started POST "/portal_plan_document/update" for 127.0.0.1 at 2011-03-31 18:04:37 -0400 

ActionController::RoutingError (No route matches "/portal_plan_document/update"): 

Estoy perdido como qué hacer desde aquí. ¡Cualquier ayuda sería muy apreciada!

Debo decir que estoy usando Ruby 1.9.2 y Rails 3.0.5. Oh, reinicié el servidor (servidor WebBrick w/rails) después de actualizar routes.rb.

Jeremy

+0

he encontrado que si cambiaba: method => "POST" a: method => "PUT" y cambiar las palabras clave ruta "publicar" para "poner" que todo funciona bien. Cambiarlos a "publicar" hace que todo falle, como se indicó anteriormente. Por lo tanto, poner obras, publicar falla? – jeremy

+0

Hoy he descubierto este mismo problema en mi código. poner obras, publicar falla. – YenTheFirst

+0

La mayoría de los navegadores no admiten nada más que solicitudes GET y POST, por lo que Rails falsifica PUT y DELETE con campos ocultos en POST. Vea la respuesta de Yen a continuación para la solución. – Andrew

Respuesta

7

¡Lo descubrí! :) si tiene un objeto no vacío, Rails asume que desea actualizar ese objeto. es decir, use un 'PUT' en lugar de un 'POST'

para lograr 'PUT', los rieles colocarán una entrada oculta en el formulario, con "_method" = "put". entonces, parece que es un POST, pero Rails lo está tratando como PUT.

si realmente desea actualizar un objeto (lo que parece que está haciendo), un PUT es mejor, y debe simplemente cambiar sus rutas a PUT.

si (como yo), que estás haciendo algo que realmente requiere un POST (es decir, que no se pueden enviar más de una vez con seguridad), se puede escribir el form_for así:

<%= form_for @plan_doc, 
:url => portal_plan_document_update_path, 
:html=>{:method => "POST"}, :remote => true do |f| %> 

para confirmar, consulte la fuente HTML generada y asegúrese de que el campo oculto "_method" no esté configurado como "put"

+0

Buena captura, y buena respuesta, yenes. – Andrew

0

Trate de usar que en lugar favor:

:method => :post 

Si esto no funciona todavía, por favor perder el atributo remoto y darle una oportunidad. ¿Funciona sin eso?

+0

Ni trabajo. La solicitud se ve como un método de publicación, como confirmaron los rieles, en el registro que dice "Start POST/portal_plan_document/update". – jeremy

0

Tuve el mismo problema al actualizar una aplicación sencilla de Rails 2 a Rails 3. As usted puede adivinar que estaba actualizando todos los helpers de "remote_form_for (@item) (..)" a la sintaxis "form_for: item remote => true (..)".

En mi caso el código de un artículo en/_new.html.erb parcial:

<%= form_for :item, :remote => true do |f| %> 
<!--FIELDS--> 
<% end %> 

me dio este error:

Started POST "/items/new" for 127.0.0.1 at Fri Aug 12 18:19:23 +0200 2011

ActionController::RoutingError (No route matches "/items/new")

Como se puede notar que el método fue un POST correcta" ", no un" PUT ". El problema mintió en el enrutamiento ... No sé por qué, pero cuando un método POST remoto es enviado por un parcial, Rails enruta la solicitud POST a la ruta "/ items/new" en lugar de "/ items". Incluso si el propósito es crear un nuevo "elemento" para que la solicitud POST se canalice correctamente (y RESTfully) a "/ items".

Este código, la acción explícita y controlador, resolvió el problema:

<%= form_for :item, :remote => true, :url => { :controller => "items", :action => "create" } do |f| %> 
<!--FIELDS--> 
<% end %> 
Cuestiones relacionadas