如何使用lambda将路由缓存到变量中,但如何在路由块之外创建它?
在调用routes.rb块之前加载的somefile.rb:
x = lambda do
namespace :test do
root to: 'application#index'
get 'page/:page', to: 'pages#show', as: :page
end
end
routes.rb中:
Rails.application.routes.draw do
x.call if yep
end
这样的代码不起作用,因为某些DSL类加载错误。我真的不明白范围内的块是如何工作的。
答案 0 :(得分:2)
您可以直接将lambda传递给draw
方法:
# config/routes.rb
conditional_routes = lambda {
namespace :test do
root to: 'application#index'
match 'page/:page' => 'pages#show', as: :page
end
}
TestApp::Application.routes.draw do
# default routes
end
TestApp::Application.routes.draw(&conditional_routes) if yep
在这个例子中,我在同一个文件(config/routes.rb
)中定义了lambda,但你可以把它放在初始化器或库文件中,或者你喜欢的地方:
# config/initializers/conditional_routes.rb
module ConditionalRoutes
def self.routes
lambda {
# ...
}
end
end
# config/routes.rb
TestApp::Application.routes.draw(&ConditionalRoutes.routes)
答案 1 :(得分:0)
在初始化程序中:
class Routes
attr_accessor :routes
def initialize(routes)
@routes = routes
end
module Helper
def test_namespace
Routes.new(self).create_routes
end
end
def self.install!
ActionDispatch::Routing::Mapper.send :include, Routes::Helper
end
def create_routes
routes.namespace :test do
root to: 'application#index'
get 'page/:page', to: 'pages#show', as: :page
end
end
end
Routes.install!
在您的路线中
Rails.application.routes.draw do
test_namespace if yep
end
我真的不确定它会起作用,但它可能会给你一些想法。
答案 2 :(得分:0)
在routes.rb 中保持路径声明显式通常是一种很好的做法。 routes.rb文件是您必须查看路径定义方式的唯一位置。
此外,无需拨打routes.draw
两次电话。
的routes.rb
TestApp::Application.routes.draw do
constraints(Yep) do
namespace :test do
root to: 'application#index'
get 'page/:page', to: 'pages#show', as: :page
end
end
end
LIB / yep.rb
class Yep
def self.matches?(request)
# if this returns true, your routes block will be drawn
end
end