18

単一のネストされたプロファイルリソースを持つ単純なユーザーモデルがあるので、routes.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はプロファイルのIDです。ルーティングは「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が生成されます。

何か案は?ああ、それが助けになるなら、私はRails3.0.0とRuby1.9.2を使用しています。

4

3 に答える 3

12

見回したところ、更新を生成するフォームのURLが正しくないようです。誰かがこの問題を見ている場合、それは私が私のフォームを次のように設定したためです:

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

これにより、フォームアクションのURLが正しくなくなりました(上記の問題のあるフォームの)。代わりに、私は使用しました

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

そして、すべてがうまくいったようでした。

于 2011-01-22T02:19:14.773 に答える
4

ルートにあるように、user_profile_path(@user)にリダイレクトする必要があります。

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

これをよく見ると、必要なのは:user_idパラメーターのみであり、パス内の@userのみであることがわかります。

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

あなたのroutes.rbにresource* s *:profilesがあればそれは正しいでしょう、そしてあなたはあなたの例のようにあなたのパスを使うこともできます。

于 2011-01-22T00:36:42.980 に答える
0

user_profile_path(@user)正しいはずです。あなたは1つが戻っていると確信していますmydomain.com/users/4/profile.22か?

于 2011-01-22T00:29:56.803 に答える