単一のネストされたプロファイルリソースを持つ単純なユーザーモデルがあるので、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を使用しています。