根据标志/常量禁用rails路由

时间:2015-08-17 23:42:46

标签: ruby-on-rails ruby rspec

我有一个导轨引擎,其中定义了一个简单的常量。

require 'my_engine/engine'
module MyEngine
  OPEN_SIGNUPS = false
end

在我的路线中我有类似

的东西
if MyEngine::OPEN_SIGNUPS
  get 'sign_up'
else
  get 'request_access'
end

基本上,如果我没有启用注册功能,则用户可以请求访问测试版。

不幸的是,这证明很难测试bc我认为路由文件只加载一次(在这里使用rspec)。我尝试用

来删除常量
stub_const("MyEngine::OPEN_SIGNUPS", true)

测试开放版本,但我遇到了让它运行的问题。

是否有更好的方法可以使用基于简单标志或常量的“条件”路线。也许是constraints的某种组合?此时我正在考虑添加所有路由并检查每个控制器是否未打开OPEN_SIGNUP,如果不是,则重定向到请求访问页面。

1 个答案:

答案 0 :(得分:1)

你是对的,路由只在你的rails服务器启动时加载一次,所以你所拥有的只是在启动时被唤醒。但是你可以使用lambdas或任何其他函数添加动态内容。

get 'signups', to: 'something#index', constraints: lambda{ |request| MyEngine::OPEN_SIGNUPS }

get 'request_access', to: 'other_thing#index', constraints: lambda{ |request| !MyEngine::OPEN_SIGNUPS }

这是高级圣徒的链接。 http://guides.rubyonrails.org/routing.html#advanced-constraints

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