2012-10-24 4 views
3

카미나리를 사용하여 페이지 매김을 처리하고 있습니다. 최근에 많은 가짜 요청이 잘못된 페이지 번호 (예 : /post/page/undefined)를 요청하고 있음을 알게되었습니다. Solr을 사용하고 있기 때문에 잘못된 페이지 번호가 전달되어 500 개의 오류가 발생합니다.카미나리를 사용할 때 페이지 번호 확인

컨트롤러에 전달되기 전에 페이지 번호의 유효성을 검사 할 수 있기를 원합니다. 따라서 잘못된 페이지 번호는 대신 라우팅 오류를 발생시킵니다.

나는 카미 마리의 창시자와 he gave a temporary solution에게 질문했습니다. 그러나 나는 이것을하는 더 깨끗한 방법이 있는지 궁금합니다. 또한이 논리를 모든 페이지 매김 가능한 자원에 포함시키고 싶지는 않습니다. DRY가 아예 없기 때문입니다.

내 경로 예 :

당신이 사용 제약을 제공하는 링크 amatsuda에 의해 제안
resources :transactions do 
    get 'page/:page', :action => :index, :on => :collection 
end 

답변

0

나는 좋은 해결책은 간단과 같이, 수정 된 URL을 제거하거나 무효이거나 경박 한 페이지 매개 변수를 수정하고 재하는 생각이 도움이

# This goes in your relevant controller(s) 
before_filter :correct_page_parameters! 

# This goes in your application controller 
def correct_page_parameters! 
    supplied_parameters = params[:page] 
    if supplied_parameters   
    proper_parameters = supplied_parameters.to_i 

    if proper_parameters < 2 
     params.delete(:page) 
     redirect_to params 
    elsif supplied_parameters != proper_parameters.to_s 
     redirect_to params.merge(:only_path => true, :page => proper_parameters) 
    end 
    end 
end 

희망, 행운을 빌어 요!

-1

.

그런 /post/page/blah에 요청 나는

resources :posts # or :transactions 

설명 더 편안하고 경로를 채택하는 것이 좋습니다 ... (당신과 유사)이 question

를 참조 할 (404) 동안, (그들이해야 등) /posts에 대한 GET 요청은 애플리케이션에 정의 된대로 작동합니다.

+0

음, 자신의 솔루션보다 제약 조건을 사용하는 예뻐 방법이? 컨트롤러간에 DRY 방식으로 페이지 1을 기본 설정하려면 어떻게해야합니까? – lulalala

+0

URL에서 페이지를 가져 와서 쿼리 문자열에 넣는 것이 좋습니다 ... 선택 사항입니다. 컨트롤러에서 params [: page] ||를 호출 할 수 있습니다. 1' – rthbound

+0

URL 접근 방식을 사용하기 때문에 액션 캐싱을 사용하고 싶습니다. 요청이'page = undefined '인 경우 기본값으로 1이 작동하지 않습니다. – lulalala

-1

당신은 그런 경로 페이지를 확인할 수 있습니다 :

resources :transactions do 
    get 'page/:page', :action => :index, :on => :collection, :page => /\d/ 
end