Rails Вложенная уникальная маршрутизация ресурсов
У меня есть простая пользовательская модель с единственным вложенным ресурсом профиля, поэтому на моих маршрутах .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, если это помогает.
Ответы
Ответ 1
Оглядываясь, кажется, что форма, генерирующая обновление, имела неправильный URL-адрес. Если кто-то видит эту проблему, это потому, что у меня была моя форма:
form_for [@user, @profile] do |f| ...
Это вызвало действие формы с неправильным URL-адресом (оскорбительной формы выше). Вместо этого я использовал
form_for @profile, :url => user_profile_path(@user) do |f| ...
и все, казалось, сработало.
Ответ 2
Вы должны перенаправить на user_profile_path (@user), так как ваши маршруты говорят, что это:
/users/:user_id/profile(.:format)
Если вы посмотрите на него внимательно, то вы увидите, что есть только: параметр user_id, вам это только @user в пути.
/users/:user_id/profile/:id(.:format)
Было бы правильно, если бы у вас были ресурсы * s *: profiles в ваших маршрутах .rb, тогда вы также могли бы использовать свой путь, как в вашем примере.
Ответ 3
user_profile_path(@user)
должен быть правильным. Вы уверены, что он возвращает mydomain.com/users/4/profile.22
?