我正在关注高级约束的导轨指南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`目录。这两种方法都不起作用。
答案 0 :(得分:2)
此课程的预期位置为 lib / constraints 。
<强>更新强> 根据有用的评论,我会尝试将其作为一个完整的答案。
根据文档,您的约束类应放在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
。