私は私が持っている私のroutes.rbをで非常に特異ネストされたプロファイルリソースを持つシンプルなUserモデルがあります:Railsのネストされた特異なリソースルーティング
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を生成します。
アイデア?ああ、私はRails 3.0.0とRuby 1.9.2を使用しています。
私もこの問題を抱えています。ルーティングは、@profileを扱っていることを知るのに十分にスマートでなければなりません。これは単数であり、idをURLに入れません。私は親オブジェクトのクラス1が何であるかわからないので、多形性のURLを扱うので、これを回避する方法があることを願っています(@userが必ずしもユーザークラス)。 –
これは長い間の[バグの虫](https://github.com/rails/rails/issues/1769)です。 –