2012-10-24 23 views
3

我正在使用Kaminari來處理分頁。我最近發現很多虛假請求正在請求一個無效的頁碼,例如/post/page/undefined。由於我使用的是Solr,所以錯誤的頁碼被傳入並導致500錯誤。使用Kaminari時驗證頁碼

我希望能夠在傳遞給控制器​​之前驗證頁碼。所以無效的頁碼會導致路由錯誤。

我問了Kaminari的創建者和he gave a temporary solution。不過,我想知道是否有更乾淨的方法來做到這一點。我也不想將這個邏輯包含在每個可分頁的資源中,因爲這根本不會幹。

我的路線例如:

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

至於建議由您提供的,使用約束鏈接amatsuda。

請參閱本question(類似於你)......

我建議由

resources :posts # or :transactions 

採用更REST風格的路線,描述然後請求到/post/page/blah將404(他們應該),而GET/posts的請求將按您的應用程序中的定義運行。

+0

嗯,是有辦法使用約束比他的解決方案更漂亮的方法是什麼?我怎樣才能以控制器的DRY方式默認第1頁? – lulalala

+0

我建議將網頁從網址中取出並放入查詢字符串中......這種方式是可選的...在您的控制器中,您可以調用'params [:page] || 1' – rthbound

+0

我想使用動作緩存,所以我使用了URL方法。如果請求是'page = undefined',那麼默認爲1將無法工作。 – lulalala

-1

你可以在這樣的路線驗證頁面:

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