45

私はこのようにマウントする小さなレールエンジンを作っています:

mount BasicApp::Engine => "/app"

この回答を使用して、エンジン内のすべてのルートが次のようになっていることを確認しました。

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

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 は機能しません。

4

3 に答える 3

62

正しい方法

最良の解決策は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ビューまたはヘルパーを呼び出すことができます。

別の方法

もう 1 つのオプションは、マウントされたエンジンを使用せず、代わりにエンジンにルートをアプリに直接追加させることです。ソートボットの 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)
于 2012-02-07T14:28:51.957 に答える
16

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
于 2016-01-19T10:56:57.327 に答える