2011-11-14 8 views
6

Aunque generalmente va en contra de nuestros principios de diseño, necesitamos que un controlador ejecute su acción #create en una solicitud GET (es parte de un flujo de trabajo que involucra una serie de redirige para un servicio externo). ¿Alguien sabe cuál es la forma prevista de hacer esto? Realmente no quiero salir del ingenioso marco de enrutamiento proporcionado por las rutas de Rails. No necesitamos la acción #index que normalmente respondería a esa solicitud GET.Rutas ingeniosas, pero con la acción #create usando GET en lugar de POST

que encontré (sorprendentemente) que esto funciona, pero no sé si es la intención, o si estaríamos explotando un error en Rails y riesgos de rotura después de la línea:

resources :agreements, :except => [:index, :create] do 
    get :create, :on => :collection 
end 

Si get :create que era get :something, habríamos tenido una ruta como

Helper: something_agreement_path 
Request: GET /agreements/:agreement_id/something 
Action: agreements#something 

Pero rieles realidad genera lo que queremos:

Helper: agreements_path 
Request: GET /agreements 
Action: agreements#create 

Error o característica?

Respuesta

1

Sé que esto puede no ser para el último código de enrutamiento, pero este enlace tiene un montón de información sobre el enrutamiento de Rails. En la sección 2.3 cubre cómo se construyen las rutas RESTful.

Rails Routing from the Inside Out

Si tuviera que adivinar por lo que he leído allí brevemente. Las acciones REST predeterminadas se asignan manualmente a una ruta específica. Entonces, cuando cambia la acción de crear para usar GET, tiene algún tipo de registro (hash de rutas) que ya ha creado antes de crear uno nuevo.

Para responder a su pregunta, supongo que este comportamiento se basa en el funcionamiento interno del código de enrutamiento para Rails. Supongo que siempre es posible que esto cambie en algún momento en el futuro.

+0

Gracias, voy a leer sobre esto. Pensé que se trataba de la * implementación *, que es lo que me preocupa ... si no es el * comportamiento * previsto, entonces esto se romperá en algún momento. Tal vez debería definir una acción diferente de '# create'; Ahora tengo curiosidad si hay un enfoque intencionado para cambiar el verbo HTTP utilizado para cada acción :) Podemos cambiar la ruta, pero aparentemente no el verbo. – d11wtq

Cuestiones relacionadas