2011-08-02 3 views
7

레일즈 2.3.11에서 작업 중입니다. http://www.abc.com/users/e.f.json과 같은 URL을 가지고 있다면 id가 'e.f'이고 예상되는 형식이 'json'이 될 것으로 기대합니다. 누군가 그것을 할 수있는 방법을 제안하시기 바랍니다 수 있습니다. 감사합니다.레일의 ID에 점이 있음

+1

2.3의 경로 구문에 익숙하지 않지만 마침표를 허용하지 않는 형식에 제약 조건을 추가해 볼 수 있습니다. 이렇게하면 형식을 마지막 점으로 구분 된 세그먼트로만 유지하는 데 도움이됩니다. 형식을 사용하지 않으면 ID의 일부가 형식으로 사용됩니다. – coreyward

+0

[Rails - "점"이 포함 된 Params (예 : /google.com)] (http://stackoverflow.com/questions/2952235/rails-params-with-dot-e-g-google-com) 가능한 복제본 –

답변

8

: 형식 규칙 때문에 Rails는 모든 매개 변수를 점없이 구문 분석합니다. 당신이 원하는 경우 route parameters with dots을 가질 수

# You can change the regex to more restrictive patterns 
map.connect 'users/:id', :controller => 'users', :action => 'show', :id => /.*/ 

그러나 이후

모두 '*'와 '+'정규식 와일드 카드는 무시합니다, 욕심 : 완전히 PARAM (형식입니다.)입니다. 형식 정규식 :

map.connect 'users/:id:format', :controller => 'users', :action => 'show', :requirements => { :format => /\.[^.]+/, :id => /.*/ } 
map.connect 'users/:id', :controller => 'users', :action => 'show' 

단점은 당신이있는 점을 포함해야한다는 것입니다 : 당신이 절대적으로 사용자 이름에 점을 가지고해야하는 경우

지금, 당신을 도울 수있는 의사 해결 방법은 그렇지 않으면 사용자 이름 표현식에 의해 캐치됩니다. 그런 다음 컨트롤러에서 점선 형식 (예 : .json)을 처리해야합니다.

2

여기는 andersonvom 's와 비슷한 해결책이지만 모든 규칙을 하나의 규칙으로 유지합니다 (현대 레일 라우팅 약어를 사용합니다).

map.connect 'users/:id(.:format)', to: 'users#show', id: /.*?/, format: /[^.]+/ 

(:format 앞에 . 주)

트릭은, (.:format)를 선택 형식을 추가하고 형식이 인식되도록 ID 정규식이 아닌 욕심 확인하는 것입니다. 하나의 규칙으로 유지하는 것은 경로에 이름을 지정하려는 경우 중요하므로 형식에 상관없이 리디렉션, 링크 등에 사용할 수 있습니다.