2012-06-14 2 views
1

내 레일 프로젝트는 HTML 형식을 페이지 매김하고 다른 페이지는 페이징하지 않습니다. @contacts 컬렉션을 얻는 데있어 차이점을 다루는 좀 더 우아한 접근 방식을 제안 할 수 있습니까? 아마도 페이지 매김 버전은 HTML 만 지원하는 다른 방법일까요? paginate_contacts_path하나의 MIME 형식은 있지만 다른 HTML 형식은 페이지 번호 지정하지 않는 레일 컨트롤러의 모범 사례

resources :contacts do 
    collection do 
    get 'paginate' 
    end 
end 

ContactsController에 별도의 PAGINATE 방법을 가지고 :

def index 
    if request.format.to_sym == :html 
    @contacts = Contact.paginate(page: params[:page]).search(params[:search]) 
    else 
    @contacts = Contact.search(params[:search]) 
    end  

    respond_to do |format| 
    format.html { render html: @contacts } 
    format.mobile { render mobile: @contacts } 
    format.json { render json: @contacts } 
    format.xml { render xml: @contacts.to_xml } 
    end 
end 

내 솔루션은 편안하고 자동적으로 나에게 경로 도우미 메서드를 제공 routes.rb의 자원으로 PAGINATE을 추가했다

def index 
    @contacts = Contact.search(params[:search]) 

    respond_to do |format| 
    format.html { render html: @contacts } 
    format.mobile { render mobile: @contacts } 
    format.json { render json: @contacts } 
    format.xml { render xml: @contacts.to_xml } 
    end 
end 

def paginate 
    @contacts = Contact.paginate(page: params[:page]).search(params[:search]) 

    respond_to do |format| 
    format.html 
    end 
end 

답변

0

불일치가 발생하고 조각을 덜 테스트 할 수 있기 때문에 별도의 방법을 강력하게 선호합니다. 또한 예를 들어, 문서에서 예외를 작성해야합니다.

또 다른 방법은 일부 매개 변수를 사용하여 처리하는 것입니다. 이제 갑자기 (뷰를 변경하는 경우에만) 다른 데이터가 반환됩니다. 알 수없는 개발자에게는 오류와 같아서 문제가 발생할 수 있습니다.

마술처럼 명확한 매개 변수 또는 별도의 메서드를 사용하지 마십시오.

+0

페이지 매기기 보석을 사용하면 페이지 매기기 매개 변수가 자동으로 추가되지만, 나는 당신이 제안하는 (그리고 나는 동의한다) def paginate 메소드가 있어야한다고 생각한다. 1) contacts_path 대신에 명시 적으로 어디에서나 참조하거나 2) 단순히 contacts_path ContactsController :: paginate로 리디렉션됩니다. # 2를 선택하면 어떻게해야합니까? –

+0

# 2를해야한다는 것이 분명 해졌고 위의 그림과 같이 내 RESTful 리소스에 '페이지 매김'을 추가하여 만들었습니다. –

+0

니스! 네, 제가 생각하는 것에 대한 단서를 가지고 있다고 생각합니다. 프로젝트를 진행해야하는 현재와 미래의 개발자들에게는 분명히 분명합니다. 프로젝트에 행운을 빌어 요! –