5

Module クラス内から URL ヘルパーにアクセスしようとしています。これが私のコードです:

module Station
  class Plugins

    @@plugins = [] unless defined?(@@plugins) && @@plugins.class == Array

    class << self

      def all
        return @@plugins.sort_by { |p| p[:weight] }
      end

      def register(plugin = {})
        raise "plugin must be a Hash (ie.: `register(:foo => 'bar')`)" unless plugin.class == Hash
        raise "plugin must contain :name (ie.: `register(:name => 'my_plugin')`)" unless plugin[:name].present?
        plugin[:weight] = 1 unless plugin[:weight].present?
        plugin[:href] = eval("#{plugin[:name].downcase.pluralize}_url") unless plugin[:href].present?

        @@plugins.push(plugin) unless @@plugins.include?(plugin)
      end
    end
    # include default plugins: 
    Station::Plugins.register(:name => "Pages", :weight => -1)
  end
end

サーバーを実行すると、次のエラーが返されました。

undefined local variable or method `pages_url' for Station::Plugins:Class

「クラスから URL ヘルパーを呼び出す方法」についてよく読みましたが、見つけた解決策はどれもうまくいきませんでした。

4

3 に答える 3

9

まず、アクセスしようとしている URL ヘルパーが、エンジンが追加された親アプリケーションからのものであるか、このエンジンに含まれている別のエンジンからのものであるかを明確にしていません。

親アプリケーションからの場合、必要なのは次のとおりです。

main_app.pages_url

したがって、それに応じてコードを編集する必要があります。「main_app」の部分は、親アプリケーションの名前ではなく、文字通り「main_app」という単語であることに注意してください。

このエンジンに含めたエンジンの URL ヘルパーにアクセスしようとしている場合は、親アプリケーションから任意のエンジンにアクセスする場合と同様にアクセスする必要があります。すなわち:

gemspec ファイルには以下が含まれている必要があります。

s.add_dependency('my_engine', path: "~/path/to/my_engine")

routes.rb には以下が含まれている必要があります。

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

次に、コードで次を使用してアクセスします。

any_name_for_my_engine.pages_url

お役に立てれば。

編集: エンジンの application.rb ファイルを次のように変更して、親アプリケーションの ApplicationController 変数とルートをすべて継承できるようにします。

class Station::ApplicationController < ApplicationController
end

これらを連携させる方法の詳細については、Rails Guide on Enginesを参照してください。それでも問題が解決しない場合は再度質問してください。

于 2012-06-10T11:13:52.200 に答える
2

私にとってうまくいったのは、ヘルパーを特定のクラスに含めることでした:

include ENGINE_NAME::Engine.routes.url_helpers
include Rails.application.routes.url_helpers
于 2016-08-10T15:17:16.367 に答える
0

これは私にとってはうまくいきました.ActionPackのコードを読んでいるときに見つけました.

さまざまなエンジンにマウントされているすべてのmain_appヘルパーと、アプリケーションのヘルパーが含まれています。他のエンジンのルートにアクセスする場合は、これをクラスに含めることができます。

include ActionDispatch::Routing::RouteSet::MountedHelpers
于 2021-07-30T12:24:06.147 に答える