18

Tengo un modelo de usuario sencilla, con un recurso anidado perfil singular así que en mi routes.rb que tengo:rieles de enrutamiento anidada de Recursos Singular

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

Esto genera las rutas esperados:

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"} 

I 'he creado un método de actualización de controlador simple que actualiza el modelo y luego vuelve a dirigir a la actualización correcta:

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 la identificación del perfil. Claramente, esto confunde a los controladores ya que el enrutamiento interpreta el '22' como el formato.

Mi pregunta es, ¿cómo hago para redireccionar a mydomain.com/users/4/profile en su lugar? que he probado las siguientes variaciones en el estado redirect_to a ningún efecto, todos ellos resultado en la misma dirección 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, el uso de 'user_profile_path (@user)' a otra parte produce la URL correcta.

¿Alguna idea? Ah, y estoy usando Rails 3.0.0 y Ruby 1.9.2 si eso ayuda.

Respuesta

11

Después de mirar alrededor, parece que el formulario que genera la actualización tenía una URL incorrecta. Si alguien está viendo este tema, es porque yo había puesto mi forma como:

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

Esto causó la acción de formulario para tener la dirección URL incorrecta (de la forma infractor arriba). En cambio, utilicé

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

y todo parecía funcionar.

+3

También estoy teniendo este problema.El enrutamiento debe ser lo suficientemente inteligente como para saber que se trata de @profile que es un singular y no poner el id en la url. Espero que haya una forma de evitar esto porque estoy tratando con urls polimórficas por necesidad ya que no sé cuál es la clase uno de los objetos principales (en su caso, no sabría que @user es necesariamente un Clase de usuario). –

+0

Este es un largo stanting [error en los rieles] (https://github.com/rails/rails/issues/1769) –

0

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

+0

Sí, pero solo para comprobarlo añadí una instrucción 'puts' antes de la redirección y que imprimía la ruta correcta ('/ users/4/profile'), aunque en la siguiente línea, la redirección con el el mismo código exacto me envió a la url incorrecta mencionada anteriormente. –

+0

'tail -f' su archivo de registro. Tal vez está haciendo más de una redirección. ¡Sólo una corazonada! – scragz

4

Usted debe redirigir a user_profile_path (@user), ya que como sus rutas dice que es:

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

Si se mira de cerca, luego se verá, que sólo existe: parámetro user_id necesario, tú solo es @user en una ruta.

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

Sería correcta si tuviera recursos * s *: perfiles en su routes.rb, a continuación, así que podría utilizar su ruta como en su ejemplo.

+1

Estoy 100% seguro de que debes usar user_profile_path (@user). – m4risU

+0

En rieles, si lo redirige doblemente, ¡entonces lo tendrá llorando fuerte! ^^ "Quizás dejaste algo más. ¿Cuál es tu código de controlador actual? – m4risU

Cuestiones relacionadas