Проверять номер страницы при использовании Kaminari

Я использую Kaminari для разбивки на страницы. Недавно я обнаружил, что во многих фиктивных запросах запрашивается недопустимый номер страницы, например /post/page/undefined. Поскольку я использую Solr, в него передается неверный номер страницы, что вызывает ошибку 500.

Я хочу иметь возможность проверить номер страницы, прежде чем он будет передан контроллеру. Таким образом, неверный номер страницы вызовет ошибку маршрутизации.

Я спросил создателя Kaminari, и он дал временное решение. Однако мне интересно, есть ли более чистые способы сделать это. Я также не хочу включать эту логику в каждый ресурс с возможностью разбиения на страницы, так как это будет совсем не СУХОЙ.

Пример моего маршрута:

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

person lulalala    schedule 24.10.2012    source источник


Ответы (3)


Я думаю, что хорошим решением будет просто удалить или исправить любые недопустимые или необоснованные параметры страницы и перенаправить на исправленный 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

Надеюсь это поможет. Удачи!

person Brad Werth    schedule 03.11.2012

Как было предложено amatsuda в предоставленной вами ссылке, используйте ограничения.

Обратитесь к этому вопросу (похожему на ваш). ..

Я рекомендую использовать больше маршрутов RESTful, описанных

resources :posts # or :transactions

Тогда запросы к /post/page/blah будут 404 (как и должны), а запросы GET к /posts будут вести себя так, как определено в вашем приложении.

person rthbound    schedule 30.10.2012
comment
Ну, есть ли более красивый способ использовать ограничение, чем его решение? И как я могу по умолчанию использовать страницу 1 СУХИМ способом для всех контроллеров? - person lulalala; 31.10.2012
comment
Я бы рекомендовал убрать страницу из URL-адреса и поместить ее в строку запроса... таким образом, это необязательно... в вашем контроллере вы можете вызвать params[:page] || 1 - person rthbound; 31.10.2012
comment
Я хочу использовать кэширование действий, поэтому я использовал подход URL. Ваше значение по умолчанию 1 не будет работать, если запрос page=undefined - person lulalala; 31.10.2012
comment
извините, почему отправка параметров в строке запроса не позволяет использовать кэширование действий? - person rthbound; 31.10.2012
comment
Хорошо, это влияет только на кеширование страницы: guides.rubyonrails.org/, но это красивее - person lulalala; 31.10.2012

Вы можете проверить страницу на таких маршрутах:

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