3

搭載エンジンを作りました。エンジンで、次のようなヘルパー (/app/helpers/my_engine にあります) を作成しました。

module MyEngine
  module ApplicationHelper
    def link_to_login(label = "Login", options = {})
        link_to label, some_path, options
    end
  end
end

engine.rb に次のコードを追加しました。

   initializer 'my_engine.action_controller' do |app|
      ActiveSupport.on_load :action_controller do
        helper MyEngine::ApplicationHelper
      end
    end

すべて正常に動作しますが、エンジンを別のアプリにロードしてヘルパー関数を使用すると、次のエラーが発生します。

Undefined method `some_path' for MyEngine:Module

親アプリでエンジンのパスを使用する場合、次のようにパスを呼び出します: my_engine.some_path、routes.rb で名前空間のエイリアスに対してこれを行います。

mount MyEngine::Engine => "/my_engine", :as => "my_engine"

エンジンのヘルパーでパスを呼び出すにはどうすればよいですか? 誰でもルートのエイリアスを変更できるためmy_engine.some_path、ヘルパー内に配置することはお勧めできません。これを行う方法は何ですか?

UPDATE : エンジンのルート。

   MyEngine::Engine.routes.draw do

      #Devise for Users
      devise_for :users, {
        class_name: 'MyEngine::User',
        path_names: {sign_in: "login", sign_out: "logout"}, 
        :path => "u", 
        :controllers => { :registrations => "my_engine/users/registrations", :sessions => "my_engine/users/sessions" },
        module: :devise
      }

      match 'auth/:provider/callback', to: 'auth#create'
      match 'auth/failure', to: redirect('/')

      #Management of Users
      resources :users

      #Devise for Admins
      devise_for :admin_users, {
        :class_name => "MyEngine::AdminUser", 
        path_names: {sign_in: "login", sign_out: "logout"}, 
        :path => "d", 
        :controllers => { :registrations => "my_engine/admin_users/registrations", :sessions => "my_engine/admin_users/sessions" },
        module: :devise
      }

      #Management of Admins
      resources :admin_users

    end

更新 #2 : おそらく、正しい方法はプロキシ パスを使用することです。http://edgeapi.rubyonrails.org/classes/Rails/Engine.htmlマウントされた Rails エンジンの名前付きルートを確認してください

4

1 に答える 1