Rails Nested Singular Resource Routing - PullRequest
       21

Rails Nested Singular Resource Routing

18 голосов
/ 22 января 2011

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

Ответы [ 3 ]

12 голосов
/ 22 января 2011

После осмотра кажется, что форма, генерирующая обновление, имела неправильный URL.Если кто-то видит эту проблему, это потому, что моя форма настроена как:

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

Это привело к тому, что у действия формы был неправильный URL (из-за неправильной формы выше).Вместо этого я использовал

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

, и все, казалось, работало.

4 голосов
/ 22 января 2011

Вы должны перенаправить на user_profile_path (@user), поскольку, как говорится в ваших маршрутах, это:

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

Если вы посмотрите на него внимательно, то увидите, что нужен только: параметр user_id,ты только @user в пути.

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

Было бы правильно, если бы у тебя был ресурс * s *: профили в твоем маршруте.rb, тогда ты тоже мог бы использоватьваш путь, как в вашем примере.

0 голосов
/ 22 января 2011

user_profile_path(@user) должно быть правильно. Вы уверены, что один возвращается mydomain.com/users/4/profile.22?

...