2011-10-01 5 views
0

먼저 모든 경로를 확인하고 내 앱에 경로가 있는지 확인합니다. 내 route.rb에서레일이 존재하는 경로와 일치 할 수 없음

resources :user do 
    resource :account 
    resource :addresses 
end 

이제 모든 것을 지금까지 괜찮습니다. 경로 도우미 방법이있어. 이

user_addresses_path 

이 도우미 메서드는 모든 곳에서 잘 작동합니다 (즉 모든보기 템플릿에서 작동 함). 한 곳을 제외하고. 내 사용자의보기 템플리트에서는 작동하지 않습니다. 나는 너를 보여줄거야.

#it works here. 
#this file is under app/view/address 
<%= user_addresses_path(@user) %>  

#it doesn't work here. 
#this file is under app/view/user 
<%= user_addresses_path(@user) %> 

편의를 위해 여기에 모든 코드를 붙여 넣지는 않습니다.

하지만 내가 무슨 뜻인지 이해하면, 왜 이런 일이 일어 났는지 말해주세요.

자세한 내용은 댓글을 추가하십시오.

+0

오류가 있습니까? '@ user'는'nil'입니까? – Zabba

+0

물론 아니야. 오류는 컨트롤러 주소와 일치 할 수 없습니다. 하지만 그 곳을 제외한 모든 곳에서 작동합니다. – castiel

+0

이것은 이전에 보았던 것과 정확히 유사하지는 않지만 라우트 파일에서'addresses'를 복수화했는데 설정이 단일 파일로되어 있다는 사실에 문제가 있는지 궁금합니다. 의지. 당신이 설정하고있는 조건부 행동을 실제로 설명하지는 않습니다. – MrDanA

답변

2

저는이 문제가 사용자의 중첩 경로로 정의 된 주소 경로를 얻는 방법이라고 생각합니다. 특히, rails documentation에 상태 :

그 레코드에 대한 명명 된 경로를 트리거하는 대신 옵션 매개 변수로 해시 (액티브 레코드 또는 Active 자원 등의) 기록을 전달. 조회는 클래스 이름에서 수행됩니다. 따라서 Workshop 객체를 전달하면 workshop_path 경로가 사용됩니다. admin_workshop_path와 같이 중첩 된 경로가있는 경우이를 명시 적으로 호출해야합니다 (url_for가 해당 경로를 추측하는 것은 불가능합니다).

즉, 참조되는 경로가 중첩 된 경로로 정의되어 있기 때문에 레일스는 경로를 추측 할 수 없습니다. 주소는 사용자 내부에 중첩되어 있기 때문에 특정 주소에있을 때 사용자를 추측 할 수 있지만 사용자 수준에서는 주소를 추측 할 수 없습니다.

또한 '일대 다'사용자 대 주소 관계 일 가능성이 있습니까? 이 경우 귀하의 resource은 경로 파일에 resources (복수형) 일 필요가 있습니다.

user_addresses   POST /user/:user_id/addresses(.:format)  {:action=>"create", :controller=>"addresses"} 
new_user_addresses  GET /user/:user_id/addresses/new(.:format) {:action=>"new", :controller=>"addresses"} 
edit_user_addresses GET /user/:user_id/addresses/edit(.:format) {:action=>"edit", :controller=>"addresses"} 
         GET /user/:user_id/addresses(.:format)  {:action=>"show", :controller=>"addresses"} 
         PUT /user/:user_id/addresses(.:format)  {:action=>"update", :controller=>"addresses"} 
         DELETE /user/:user_id/addresses(.:format)  {:action=>"destroy", :controller=>"addresses"} 

하지만,

resources :user do 
    resources :addresses 
end 

당신에게 제공합니다 : (복수의) 두 번째 옵션은 수 있도록 당신에게 경로를 제공한다는

    POST /user/:user_id/addresses(.:format)   {:action=>"create", :controller=>"addresses"} 
new_user_address GET /user/:user_id/addresses/new(.:format)  {:action=>"new", :controller=>"addresses"} 
edit_user_address GET /user/:user_id/addresses/:id/edit(.:format) {:action=>"edit", :controller=>"addresses"} 
user_address  GET /user/:user_id/addresses/:id(.:format)  {:action=>"show", :controller=>"addresses"} 
        PUT /user/:user_id/addresses/:id(.:format)  {:action=>"update", :controller=>"addresses"} 
        DELETE /user/:user_id/addresses/:id(.:format)  {:action=>"destroy", :controller=>"addresses"} 

공지 사항을

resources :user do 
    resource :addresses 
end 

당신에게 제공 각 사용자에 대해 여러 주소를 지정하는 반면, t 그는 단 하나 노선 만 당신에게 단 하나 주소를 준다.

+0

고마워, 이것이 문제가되어야한다고 생각해. – castiel

관련 문제