Rails路由缓存在变量中

时间:2012-08-13 20:17:37

标签: ruby-on-rails-3 lambda routes

如何使用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类加载错误。我真的不明白范围内的块是如何工作的。

3 个答案:

答案 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