使用Kaminari时验证页码

时间:2012-10-24 06:11:48

标签: ruby-on-rails pagination rails-routing kaminari

我正在使用Kaminari来处理分页。我最近发现很多虚假请求正在请求无效的页码,例如/post/page/undefined。由于我使用的是Solr,因此传入错误的页码并导致500错误。

我希望能够在传递给控制器​​之前验证页码。因此,无效的页码将导致路由错误。

我问过Kaminari的创造者,he gave a temporary solution。但是我想知道是否有更清洁的方法来做到这一点。我也不想在每个可分页资源中包含这个逻辑,因为它根本就不会干。

我的路线示例:

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

3 个答案:

答案 0 :(得分: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 :(得分:-1)

正如amatsuda在您提供的链接中所建议的那样,使用约束。

请参阅此question(与您的类似)...

我建议采用更多RESTful路由,由

描述
resources :posts # or :transactions

然后/post/page/blah的请求将是404(他们应该),而GET/posts的请求将按照您的应用中的定义行事。

答案 2 :(得分:-1)

您可以在以下路线中验证页面:

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