2009-10-05 24 views
5

私は、Rails 2.3を使用して様々なモジュール(ブログ、カレンダーなど)でCMSを構築しています。各モジュールは異なるコントローラで処理され、うまく動作します。データベースベースの動的レールのルーティング

私が唯一の問題は、ルートのURLです。ユーザーが選択した構成に応じて、このデフォルトのURLは別のモジュール、つまり別のコントローラーを表示する必要がありますが、正しいコントローラーを判別する唯一の方法は、「デフォルト」モジュールを表示するデータベースを確認することです。

現時点では、データベースをチェックする特定の「ルート」コントローラを使用しています。は、正しいコントローラにをリダイレクトします。しかし、私はURLが変更されないようにしたいと思います。つまり、同じリクエストから正しいコントローラを呼び出す必要があります。

私はRails Metalを使ってこの情報を取得し、手動でコントローラを呼び出そうとしましたが、コントローラを選択する要求パスを識別したり、セッションを管理するなど、ホイールを再開発している可能性があります。

ありがとうございます!

答えて

5

この問題は、いくつかのラックミドルウェアで解決することができます。

このコードは、lib/root_rewriter.rbに:

module DefV 
    class RootRewriter 
    def initialize(app) 
     @app = app 
    end 

    def call(env) 
     if env['REQUEST_URI'] == '/' # Root is requested! 
     env['REQUEST_URI'] = Page.find_by_root(true).uri # for example /blog/ 
     end 

     @app.call(env) 
    end 
    end 
end 

場合は、下の

require 'root_rewriter' 
ActionController::Dispatcher.middleware.insert_after ActiveRecord::QueryCache, DefV::RootRewriter 

でごconfig/environment.rbに本ミドルウェアは、チェックします要求されたページ(REQUEST_URI)は '/'で、次に実際のパスを検索します(これはあなた次第です;-))。 (Cache.fetch('root_path') { Page.find... }

REQUEST_URIにはいくつかの問題があります。すべてのウェブサーバーがこれを正しく渡すわけではないためです。 Railsの全体実装の詳細については、これは私が(まだミドルウェア)思い付いた何だったのRails 3.2ではhttp://api.rubyonrails.org/classes/ActionController/Request.html#M000720(「ソースを表示」をクリックしてください)

+0

!これは多かれ少なかれ私がすでにやろうとしていたものでしたが、今まで成功していませんでした。おかげでJan! –

2

を参照してください。

class RootRewriter 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    if ['', '/'].include? env['PATH_INFO'] 
     default_thing = # Do your model lookup here to determine your default item 
     env['PATH_INFO'] = # Assemble your new 'internal' path here (a string) 
     # I found useful methods to be: ActiveModel::Naming.route_key() and to_param 
    end 

    @app.call(env) 
    end 
end 

これはパスがあるのRailsを伝えます要求されたもの(ルートパス)とは異なり、link_to_unless_currentなどへの参照は依然としてうまく機能します。

ので、初期化子のようにミドルウェアをロードします。はい、この作品

MyApp::Application.config.middleware.use RootRewriter 
関連する問題