web-dev-qa-db-ja.com

マウントされた名前付きルートRails engine

私は小さなRailsエンジンを次のようにマウントしています:

mount BasicApp::Engine => "/app"

this answer を使用して、エンジン内のすべてのルートが次のとおりであることを確認しました。

ただし、(エンジン内で)名前付きルート(エンジン内で定義)にリンクすると、このエラーが発生します

undefined local variable or method `new_post_path' for #<#<Class:0x000000065e0c08>:0x000000065d71d0>

「rake route」を実行すると、「new_post」が名前付きパスであることを明確に確認できるため、Rails(3.1.0)がそれを理解できない理由はわかりません。どんな助けでも大歓迎です

私のconfig/route.rb(エンジン用)は次のようになります

BasicApp::Engine.routes.draw do
  resources :posts, :path => '' do
                resources :post_comments
                resources :post_images
        end
end

それが分離されたエンジンであることを追加する必要があります。ただし、main_app.root_pathなどのパスは正常に機能しますが、root_pathは機能しません

37
Markus

正しい方法

ヘルパーメソッドとして利用できるエンジンのルートプロキシでnew_post_pathを呼び出すのが最善の解決策だと思います。あなたの場合、ヘルパーメソッドはデフォルトでbasic_app_engineになるため、ビューまたはヘルパーでbasic_app_engine.new_post_pathを呼び出すことができます。

必要に応じて、2つの方法のいずれかで名前を設定できます。

# in engine/lib/basic_app/engine.rb:
module BasicApp
  class Engine < ::Rails::Engine
    engine_name 'basic'
  end
end

または

# in app/config/routes.rb:
mount BasicApp::Engine => '/app', :as => 'basic'

どちらの場合も、ビューまたはヘルパーでbasic.new_posts_pathを呼び出すことができます。

別の方法

別のオプションは、マウントされたエンジンを使用せず、代わりにエンジンにルートをアプリに直接追加させることです。 ThoughtbotのHighVoltage がこれを行います。多くのエンジンを追加すると名前空間の競合が発生する可能性があるため、このソリューションは好きではありませんが、機能します。

# in engine/config/routes.rb
Rails.application.routes.draw do
  resources :posts, :path => '' do
                resources :post_comments
                resources :post_images
  end
end

# in app/config/routes.rb:
# (no mention of the engine)
57
James A. Rosen

Rails 4の場合、engine_nameディレクティブは機能しませんでした。
エンジン自身のビューまたはコントローラーからエンジンのルートで定義された名前付きルートにアクセスするために、私は詳細を使用してしまいました

BasicApp::Engine.routes.url_helpers.new_post_path

これをより使いやすくするために、簡単なヘルパーメソッドを定義することをお勧めします

# in /helpers/basic_app/application_helper.rb

module BasicApp::ApplicationHelper
  def basic_app_engine
    @@basic_app_engine_url_helpers ||= BasicApp::Engine.routes.url_helpers
  end
end

これを配置すると、今すぐ使用できます

basic_app_engine.new_post_path

エンジンからメインアプリケーションヘルパーにアクセスする必要がある場合は、main_appを使用できます。

main_app.root_path
9
Epigene

アプリで以下を使用して、エンジンルートにアクセスします

MyApp::Engine.routes.url_helpers.new_post_path
3
edrich13