18

는 나의 routes.rb에서 내가 가진 :레일은 중첩 된 단수 자원 라우팅 나는 단수 중첩 된 프로파일 자원 간단한 사용자 모델을 가지고

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"} 

I :

resources :users do 
    resource :profile, :only => [:edit, :update, :show] 
end 

이것은 예상 경로를 생성 모델을 업데이트하고 성공적인 업데이트시 리디렉션하는 간단한 컨트롤러 업데이트 메서드가 만들어졌습니다.

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(user_profile_path(@user), ...) 
redirect_to(user_profile_path(@user, @profile), ...) 
redirect_to([@user, @profile], ...) 
redirect_to(@profile, ...) 

는 'user_profile_path (@user를)'를 사용하여 다른 곳에서 올바른 URL을 생성합니다 나는 그들이 같은 잘못된 URL에있는 모든 결과, 효과 없음에 redirect_to 문에 다음과 같은 변화를 시도했습니다.

아이디어가 있으십니까? 아, 레일즈 3.0.0과 루비 1.9.2가 도움이된다면 사용하고 있습니다.

답변

11

주위를 둘러보고 나서 업데이트를 생성하는 양식의 URL이 잘못 표시되었습니다. 이것은 (위의 잘못된 형태의) 잘못된 URL을 가지고 양식 조치를 발생

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

: 사람이이 문제를 보는 경우 내 형태로 설정했다 때문입니다. 대신, 내가 사용

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

모든 것이 작동하는 것처럼 보였다.

+3

이 문제도 발생합니다.라우팅은 그것이 유일하고 URL에 id를 넣지 않는 @profile을 처리한다는 것을 알기에 충분히 똑똑해야합니다. 부모 객체의 클래스 1이 무엇인지 알지 못해서 다형성 URL을 처리하고 있기 때문에이 문제를 해결할 수있는 방법이 있기를 바랍니다 (@ 사용자는 필자가 사용자 클래스). –

+0

이것은 [레일의 버그] (https://github.com/rails/rails/issues/1769)라는 오랜 상처입니다. –

0

user_profile_path(@user)이 정확해야합니다. 그 중 하나가 mydomain.com/users/4/profile.22을 반환 할 것이라 확신합니까? 자세히 살펴보면, 당신은 볼 수

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

만이 있다는 것을 : USER_ID 매개 변수, 네가 필요

+0

그래,하지만 그냥 리디렉션 전에 'puts'문을 추가하고 정확한 경로 ('/ users/4/profile')를 인쇄했는데, 바로 다음 줄, 정확히 같은 코드가 앞에서 언급 한 잘못된 URL로 나를 보냈습니다. –

+0

'tail -f' 로그 파일. 어쩌면 하나 이상의 리디렉션을하고있을 수도 있습니다. 그냥 직감! – scragz

4

당신은 같은 경로 때문에 (@user) user_profile_path로 리디렉션해야는 말한다 경로의 @user 일뿐입니다.

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

당신이 자원 * *이 있다면 그것은 올바른 것 : 다음뿐만 아니라 당신이 당신의 예에서와 같이 경로를 사용할 수 있습니다, 당신의 routes.rb에서 프로파일을.

+1

저는 user_profile_path (@user)를 사용해야한다는 것을 100 % 확신합니다. – m4risU

+0

리디렉션을 두 번하면 레일에서 큰 소리로 울 것입니다! ^^ "어쩌면 다른 것을 남겼을 수도 있습니다. 현재 컨트롤러 코드는 무엇입니까? – m4risU