shallow rails examples concerns ruby-on-rails ruby-on-rails-3 url-routing nested-resources

ruby-on-rails - examples - resources do rails



Rieles de enrutamiento de recursos singulares anidados (3)

Tengo un modelo de usuario simple con un recurso de perfil anidado singular, así que en mis rutas. Tengo un:

resources :users do resource :profile, :only => [:edit, :update, :show] end

Esto genera las rutas esperadas:

edit_user_profile GET /users/:user_id/profile/edit(.:format) {:action=>"edit", :controller=>"profiles"} user_profile GET /users/:user_id/profile(.:format) {:action=>"show", :controller=>"profiles"} user_profile PUT /users/:user_id/profile(.:format) {:action=>"update", :controller=>"profiles"}

He creado un método simple de actualización del controlador que actualiza el modelo y luego redirige una actualización exitosa:

def update @profile = Profile.find_by_user_id(params[:user_id]) @user = User.find_by_id(params[:user_id]) respond_to do |format| if @profile.update_attributes(params[:profile]) format.html { redirect_to( user_profile_path(@user, @profile), :notice => ''Profile was successfully updated.'') } else # ... end end end

El problema es que una vez que se envía el formulario, el formulario redirige a mydomain.com/users/4/profile.22, donde 22 pasa a ser el ID del perfil. Claramente esto confunde a los controladores ya que el enrutamiento interpreta el ''22'' como el formato.

Mi pregunta es, ¿cómo consigo que esto redirija a mydomain.com/users/4/profile en su lugar? He intentado las siguientes variaciones en la declaración redirect_to sin ningún efecto, todas dan como resultado la misma url incorrecta:

redirect_to( user_profile_path(@user), ... ) redirect_to( user_profile_path(@user, @profile), ... ) redirect_to([@user, @profile], ... ) redirect_to( @profile, ... )

Lo que es más, usar ''user_profile_path (@user)'' en otra parte produce la url correcta.

¿Algunas ideas? Ah, y estoy usando Rails 3.0.0 y Ruby 1.9.2 si eso ayuda.


Debería redirigir a user_profile_path (@user) ya que, como dice su ruta, es:

/users/:user_id/profile(.:format)

Si lo observas detenidamente, verás que solo se necesita el parámetro user_id, tú solo eres @usuario en una ruta.

/users/:user_id/profile/:id(.:format)

Sería correcto si tuviera los recursos * s *: perfiles en sus rutas.rb, entonces también podría usar su ruta como en su ejemplo.


Después de mirar alrededor, parece que el formulario que generó la actualización tenía una URL incorrecta. Si alguien está viendo este problema, es porque configuré mi formulario como:

form_for [@user, @profile] do |f| ...

Esto causó que la acción de formulario tuviera la URL incorrecta (del formulario ofensivo anterior). En su lugar, utilicé

form_for @profile, :url => user_profile_path(@user) do |f| ...

y todo parecía funcionar.


user_profile_path(@user) debe ser correcto. ¿Está seguro de que uno está devolviendo mydomain.com/users/4/profile.22 ?