基于标志/常量禁用轨道路线

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 未打开,我只想添加所有路由并检查每个控制器,如果未打开,则重定向到请求访问页面。

Aus*_*tio 2

你是对的,当你的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

就我个人而言,我仅使用约束来根据权限限制对某些区域的访问。您可能最好只有两个路由,并根据模块中的值在控制器中进行重定向。