2

ラムダを使用してルートを変数にキャッシュするにはどうすればよいですか?

routes.rb ブロックが呼び出される前に読み込まれる somefile.rb:

x = lambda do
  namespace :test do

    root to: 'application#index'

    get 'page/:page', to: 'pages#show', as: :page

  end
end

ルート.rb:

Rails.application.routes.draw do

  x.call if yep

end

このようなコードは、DSL クラスの読み込みエラーのために機能しません。スコープがブロック内でどのように機能するかがよくわかりません。

4

3 に答える 3

2

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)で定義していますが、イニシャライザーやライブラリファイルなど、好きな場所に配置できます。

# config/initializers/conditional_routes.rb
module ConditionalRoutes
  def self.routes
    lambda {
      # ...
    }
  end
end

# config/routes.rb
TestApp::Application.routes.draw(&ConditionalRoutes.routes)
于 2012-08-24T01:23:40.023 に答える
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

それがうまくいくかどうかは本当にわかりませんが、それはあなたにアイデアを与えるかもしれません。

于 2012-08-18T19:14:10.670 に答える
0

通常、routes.rb 内でルート宣言を明示的に保持することをお勧めします。routes.rb ファイルは、ルートがどのように定義されているかを確認するために必要な唯一の場所であることを意図しています。

また、2回電話をかける必要はありませんroutes.draw

ルート.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
于 2012-08-25T08:13:00.073 に答える