我有一个导轨引擎,其中定义了一个简单的常量。
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,如果不是,则重定向到请求访问页面。
答案 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
就个人而言,我只使用约束来根据权限限制对某些区域的访问。您可能最好只有两条路线,并根据模块中的值在控制器中进行重定向。