Где разместить классы ограничений в проекте Rails

Просто интересно узнать о лучших практиках для Rails, в которых я поместил собственный класс ограничений, который используется в качестве ограничения в config/rout.rb. Похоже на Rails.root/lib где все пользовательские классы идут. Это подходит для этого? Должен ли я создавать каталог внутри для ограничений? Там сейчас есть 2 пустых каталога, assets а также tasks, Есть соглашения для этого?

2 ответа

Решение

lib/ было бы подходящим местом. Если вы хотите сделать его чище, поместите его в lib/constraint/authenticated.rb и определить ваши ограничения, как так

module Constraint
  class Authenticated
    def matches?(request)
      # stuff
    end
  end
end

и в вашем routes.rb

constraints Constraint::Authenticated.new do
  match 'account' => 'account#index'
end

Странно, что в руководстве ничего не говорится об этом пути, но lib/constraints даже перечислены в API ( ActionDispatch:: Routing:: Mapper:: Scoping):

Вы можете переместить эту логику в класс, если она слишком сложна для маршрутов. Этот класс должен иметь matches? определенный для него метод, который либо возвращает значение true, если пользователю должен быть предоставлен доступ к этому маршруту, либо значение false, если пользователь не должен этого делать.

class Iphone
  def self.matches?(request)
    request.env["HTTP_USER_AGENT"] =~ /iPhone/
  end
end

Ожидаемое место для этого кода будет lib / ограничений.