2016-08-05 8 views
0

apartmentdevise gemを使用してマルチテナントアプリを作成しました。以来、私はpostgresqlを使用しているので、apartment gemはテナントごとに別々のスキーマを作成します。私のデータベースはいくつかのテーブルとして、userテーブルはパブリック名前空間にありますが、pagesテーブルは各テナント固有のスキーマにあります。私は各テナントに別々にログインすることができ、各テナントのページテーブルの個別のレコードを作成することができます。Rails:マルチテナントアプリとダイナミックルーティング

今、私はこれらのページは、私は私のroutes.rbファイル内のルールを以下ました。このため、このtenant1.example.com/page-slug-hereような形式でアクセスできるようにしたい:アプリはシングルだったときにこれらのルーティングルールが正常に動作した

Page.where.not(slug: nil).all.each do |page| 
    get "/#{page.slug}", controller: "pages", action: "show", id: page.id 
end 

マルチテナントでは機能していないため、「経路が一致しません」というエラーが表示されます。

私の推測では、上記のルーティングルールのデータベース呼び出しは、テナント固有のスキーマの代わりにpublicスキーマを探しています。この問題を解決するには?

答えて

0

私はこの問題を解決しました。上に貼り付けられたルーティングコードはチュートリアルからコピーされましたが、apartment gemはroutes.rbファイルのActiveRecordネイティブクエリではうまく動作しないようです。明らかに、Page.where()...コールは経路の解決時点でテナントを要求する代わりにpublicテナントにマップされていたので、ルータからコントローラへのデータベースクエリを移動し、コントローラでテナントシフトが正しく適用されていました。

次のように私は私のルーティングルールを簡略化してきたし、今では働いていると私は私のコントローラでスラグによって、適切なページを見つけることができます。

get '/:slug' => 'pages#show' 
関連する問題