私は小さな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は機能しません
ヘルパーメソッドとして利用できるエンジンのルートプロキシで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)
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
アプリで以下を使用して、エンジンルートにアクセスします
MyApp::Engine.routes.url_helpers.new_post_path