Подтвердить что ты не робот

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, если это помогает.

4b9b3361

Ответ 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?