2011-09-13 2 views
1

나는 (routes.rb에서)이 경로가있는 경우 :Rails3의 해시 (중첩 된) 매개 변수를 사용하여 예쁜 URL을 만드는 방법은 무엇입니까?

match 'posts', :to => 'posts#index' 

그것은 표시하고 다음 경로와 일치합니다 : I 메인 URL의 카테고리 PARAM 부분을 확인하려면

# Case 1: non nested hash params 
posts_path(:search => 'the', :category => 'old-school') 
#=> "/posts?search=the&category=old-school" 

# Case 2: nested hash params 
posts_path(:filter => {:search => 'the', :category => 'old-school'}) 
#=> "/posts?filter[search]=the&filter[category]=old-school" 

을 , 사례 1에 대해이 작업을 수행 할 수 있습니다.

match 'posts(/:category)', :to => 'posts#index' 
표시하고 다음 경로를 일치

:

# Case 1: non nested hash params 
posts_path(:search => 'the', :category => 'old-school') 
#=> "/posts/old-school?search=the" 

그러나 PARAM이 (사례 2)를 중첩 만약 내가 같은 할 수있는 방법?

match 'posts(/:filter[category])', :to => 'posts#index' 

이 방식으로 작동하기 :

나는 다음 경로 정의를 기대

# Case 2: nested hash params 
posts_path(:filter => {:search => 'the', :category => 'old-school'}) 
#=> "/posts/old-school?filter[search]=the" 

을하지만 그것은 작동하지 않습니다.

나는 아무 맞 답이 개 장소에서이 같은 질문을 발견 :

Rails Guides 이것에 대해 anthing를 지정하지 마십시오.

레일에서이 작업을 수행 할 수 없다고 가정해야합니까? 정말?

답변

0

당신은 당신이 그것을 의도 한대로 다음 경로가 작동하지 않습니다 대신

match 'posts', :to => 'posts#index' 
match 'posts/:category', :to => 'posts#index' 

두 개의 서로 다른 경로를 만들 수 있습니다.

match 'posts(:filter[category])', :to => 'posts#index' 

: 필터는 URL 도우미 또는 키의 값으로 전달 된 첫 번째 인수 이잖아 중 단지 장소 홀더이다. A의 필터가 그 전달 된 한 경로 문자열의 모든 표현하지 않습니다 평가받을 수 있습니다.

귀하의 질문에 대한 대답은 당신이 레일에서 할 수 없다는 것입니다. 나는 당신이 다른 방식으로 이것을한다고 생각하지만 당신에게 제안 할 것입니다. 컨벤션을 따르고 자신을 편하게 만드는 것이 레일에서 매우 도움이됩니다.

여기 세 가지를하고있는 것처럼 보입니다. 기본 게시물 경로

match 'posts', :to => 'posts#index' 

중첩 된 카테고리가있는 경로.어떤 다른 하나

match 'posts/search', :to => 'posts#search' 

정말이 사용자에게 더 나은 URL

match 'posts/:category', :to => 'posts#index' 

그리고 첫 번째와 동일하거나 액션 청소기를 만들기 위해 검색 URL을 줄 가능성이 높습니다 내가 생각하는 방식대로 노선을 복잡하게 만들 수 있다고 생각할 수있는 이유. 어쨌든 검색 쿼리 URL이 좋지 않으므로 검색을 위해 두 개의 URL을 처리해야합니다. 단지 하나만 할 것입니다.

당신은 확실히 당신이 당신의 루트 파일에 정의 정확히 무엇을 말할 것이다이 같은

rake routes 

을 실행에보고해야한다. 또한 라우팅 테스트를 설정하여 사용자 정의 라우트가 올바르게 수행되도록 할 수 있습니다.

(당신이 표시됨) 귀하의 예제는 작동하지 않습니다

# Case 2: nested hash params 
posts_path(:filter => {:search => 'the', :category => 'old-school'}) 
#=> "/posts/old-school?filter[search]=the" 

그러나 당신이 찾고해야하는 것은이 이런 식으로 할 괜찮이

posts_path(:filter => {:search => 'the', :category => 'old-school'}) 
#=> "/posts?filter[search]=the&filter[category]=old-school" 

입니다.

게시물/: category를 보관하려면 탐색이 아닌 탐색 전용으로 사용하십시오. (: 카테고리 /)

+0

을하는 데 도움이

희망 당신은 경로 정의 구문 오류 게시물에 맞다. 나는 이미 질문을 편집했다 (당신은 대답도 편집해야한다). – tothemario

+0

나는 rake routes를 사용하는 것에 대한 설명과 제안을 좋아한다. (중첩 된 route를 테스트 할 수는 없지만). – tothemario

+0

하지만, 내 결론은 당신이 그렇게 할 수 없다는 것이 었습니다. 나는 명확한 URL (그리고 나는 필터 매개 변수를 제어 할 수 없었다)을 만들 필요가 있었다. 그래서이 경우 나의 해결책은 깨끗한 URL을 잊어 버렸다. – tothemario

관련 문제