typ*_*ror 5 ruby rspec ruby-on-rails
我有一个 rails 引擎,其中定义了一个简单的常量。
require 'my_engine/engine'
module MyEngine
OPEN_SIGNUPS = false
end
Run Code Online (Sandbox Code Playgroud)
在我的路线中,我有类似的东西
if MyEngine::OPEN_SIGNUPS
get 'sign_up'
else
get 'request_access'
end
Run Code Online (Sandbox Code Playgroud)
基本上如果我没有启用注册功能,用户可以请求访问测试版。
不幸的是,这证明很难测试 bc 我认为路由文件只加载一次(在此处使用 rspec)。我试着用
stub_const("MyEngine::OPEN_SIGNUPS", true)
Run Code Online (Sandbox Code Playgroud)
测试开放版本,但我在让它工作时遇到问题。
有没有更好的方法可以基于简单的标志或常量获得“条件”路由。的某种组合constraints,也许?在这一点上,如果 OPEN_SIGNUPs 未打开,我只想添加所有路由并检查每个控制器,如果未打开,则重定向到请求访问页面。
你是对的,当你的rails服务器启动时,路由只会加载一次,所以你所拥有的只会在启动时评估。但是您可以使用 lambda 或任何其他函数添加动态内容。
get 'signups', to: 'something#index', constraints: lambda{ |request| MyEngine::OPEN_SIGNUPS }
get 'request_access', to: 'other_thing#index', constraints: lambda{ |request| !MyEngine::OPEN_SIGNUPS }
Run Code Online (Sandbox Code Playgroud)
这是高级约束的链接。http://guides.rubyonrails.org/routing.html#advanced-constraints
就我个人而言,我仅使用约束来根据权限限制对某些区域的访问。您可能最好只有两个路由,并根据模块中的值在控制器中进行重定向。