18

私は私が持っている私の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を使用しています。

答えて

11

周囲を見渡した後、更新を生成するフォームのURLが正しくないようです。これは、(上記の問題の形式の)誤ったURLを持つように、フォームのアクションを起こし

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

:誰もがこの問題を見ている場合は、私は自分のフォームのように設定していたので、それはです。代わりに、私は使用しました

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

すべてが動作するようです。

+3

私もこの問題を抱えています。ルーティングは、@profileを扱っていることを知るのに十分にスマートでなければなりません。これは単数であり、idをURLに入れません。私は親オブジェクトのクラス1が何であるかわからないので、多形性のURLを扱うので、これを回避する方法があることを願っています(@userが必ずしもユーザークラス)。 –

+0

これは長い間の[バグの虫](https://github.com/rails/rails/issues/1769)です。 –

0

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

+0

はい、しかし、私はリダイレクトの前に 'puts'ステートメントを追加して、正しいパス( '/ users/4/profile')を表示しました。まったく同じコードが私に前述の間違ったURLを送りました。 –

+0

'tail -f'あなたのログファイル。 1つ以上のリダイレクトを行っている可能性があります。ほんのちょっと! – scragz

4

あなたのルートはそれが言うようにので、あなたがuser_profile_pathに(@user)にリダイレクトする必要があります。

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

あなたが密接にそれを見た場合、あなただけがあることが、わかります:user_idのパラメータが必要で、あなたがパスの@userだけです。

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

あなたはリソース* *を持っていた場合、それは正しいでしょう:あなたのroutes.rbを内のプロファイルは、その後、同様にあなたはあなたの例のように、あなたのパスを使用することができます。

+1

私は100%user_profile_path(@user)を使用する必要があります。 – m4risU

+0

あなたがダブルリダイレクトすると、あなたは大声で泣くでしょう! ^^ "多分あなたは何か他のものを残したかもしれません。あなたの現在のコントローラコードは何ですか? – m4risU

関連する問題