У меня есть простая пользовательская модель с единственным вложенным ресурсом профиля, поэтому на моих маршрутах .rb у меня есть:
resources :users do
resource :profile, :only => [:edit, :update, :show]
end
Это генерирует ожидаемые маршруты:
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"}
Я создал простой метод обновления контроллера, который обновляет модель и затем перенаправляет ее при успешном обновлении:
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
Проблема заключается в том, что после отправки формы форма перенаправляется на mydomain.com/users/4/profile.22, где 22 является идентификатором профиля. Ясно, что это смущает контроллеры, поскольку маршрутизация интерпретирует "22" как формат.
Мой вопрос: как это сделать, чтобы перенаправить на mydomain.com/users/4/profile вместо этого? Я пробовал следующие варианты в команде redirect_to без каких-либо последствий, все они приводит к тому же неправильному URL:
redirect_to( user_profile_path(@user), ... )
redirect_to( user_profile_path(@user, @profile), ... )
redirect_to([@user, @profile], ... )
redirect_to( @profile, ... )
Что еще, используя 'user_profile_path (@user)' в другом месте, выдает правильный URL-адрес.
Любые идеи? О, и я использую Rails 3.0.0 и Ruby 1.9.2, если это помогает.