У меня есть простая пользовательская модель с единичным вложенным ресурсом Profile, поэтому в моем route.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, если это поможет.