我应该在哪里为routes.rb定义约束?

时间:2017-04-14 15:51:36

标签: ruby-on-rails

我正在关注高级约束的导轨指南Advanced Constraints。这是代码:

class BlacklistConstraint
  def initialize
    @ips = Blacklist.retrieve_ips
  end

  def matches?(request)
    @ips.include?(request.remote_ip)
  end
end

Rails.application.routes.draw do
  get '*path', to: 'blacklist#index',
    constraints: BlacklistConstraint.new
end

指南未提及应该定义BlacklistConstraint的位置或者是否遵循命名约定。我已尝试按照此示例供我自己使用,但我不断获得UninitialiezedConstantError: Can someone help me out? So far I;ve defined my constraint class in the 1 routes.rb file itself and in the lib`目录。这两种方法都不起作用。

1 个答案:

答案 0 :(得分:2)

此课程的预期位置为 lib / constraints

http://api.rubyonrails.org/classes/ActionDispatch/Routing/Mapper/Scoping.html#method-i-constraints-label-Dynamic+request+matching

<强>更新 根据有用的评论,我会尝试将其作为一个完整的答案。

根据文档,您的约束类应放在lib/constraints下,但由于lib目录不是由rails强烈加载,您可以通过将此行添加到config/application.rb <来启用它/ p>

config.eager_load_paths << Rails.root.join('lib')

现在rails会尝试加载lib/constraints/blacklist_constraint.rb文件并期望它正确地命名空间,因此将该类包装在一个模块中(这也使它更清晰,因为将来可能会有更多约束)

module Constraints
  class BlacklistConstraint
    def initialize
      @ips = Blacklist.retrieve_ips
    end

    def matches?(request)
      @ips.include?(request.remote_ip)
    end
  end
end

并在Constraints::BlacklistConstraint中引用routes.rb