2011-02-13 4 views
3

내가 현재 photos에 대해 설정 한 다음 경로를 가지고 : 플리커는 URL을 포맷 방식과 유사레일 3 경로 : '쇼'동작과의 충돌을 피하는 방법?

http://example.com/photos/joe_schmoe 
http://example.com/photos/joe_schmoe/123xyz 

... :

resources :photos 
match 'photos/:user' => 'photos#user', :as => :user_photo 
match 'photos/:user/:key' => 'photos#show', :as => :show_photo 

그 두 match 노선들은 나에게 같은 URL을 제공합니다.

제가하는 데 문제는, 그래도 photos/:user 경로가 show 방법으로 해석됩니다 어느 쪽이든, 또는 나는 resources하기 전에 해당 사용자 지정 경로를 넣어 경우 다음 /new 같은 경로는 user 방법으로 해석 얻을.

커스텀 라우트를 거치지 않고 어떻게 해결할 수 있습니까?

답변

8

위의 사용자 지정 경로 resources :users 위에 두어 경로에서 처음으로 일치 시키려고합니다.

match 'photos/:user' => 'photos#user', :as => :user_photo 
resources :photos 

또한 당신은 전부 show 조치를 해제 할 수 있습니다

resources :photos, :except => :show 
+0

니스,': except'는 내가 찾고있는 것입니다. – Shpigford

+0

그게 좋습니다 :) –

1

그것은 동일한 리소스에서 사용자 정의 일치하는 경로와 편안한 경로를 혼합하는 것은 좋은 생각이 아니다. 당신이 관찰했듯이이 두 경로는 서로 다른 행동을 가로 챌 것입니다. 최선의 선택은 리소스에 대해 하나의 라우팅 시스템만을 선택하여이를 사용하는 것입니다. Flickr 스타일의 라우트를 원할 경우, 편안한 루트를 제거하고 필요할 수있는 새/create/etc에 필요한 다른 일치 경로를 추가해야합니다. 두 경로를 모두 유지하기를 원한다면 나머지 경로를 따라 나머지 경로를 표시하지 않도록 설정하거나 일치 경로가 맨 위에있는 동안 새로운 경로를 사용 중지해야합니다. 이 같은 경기에서 몇 가지 요청을 필터링하는 정규 표현식을 사용할 수 있습니다 : 이것은 추한 정말 빨리 상점을 얻고 난 그냥 모든 나머지 경로를 사용하지 않는 것이 좋습니다

match 'photos/:user' => 'photos#user', :as => :user_photo, :constraints => { :user => /.*[^n][^e][^w].*/ } 

.

관련 문제