11

Railsエンジン/宝石に変えているRails 3アプリがあります。このエンジンには、.gemspec ファイル内にいくつかの gem 依存関係があります。

新しい「親」Rails 3 アプリを作成しました。エンジン gem を Gemfile に追加して、gem の依存関係を自動的に「ロード」したいのですが、うまくいきません! bundle installgem の依存関係を正常にインストールしますが、サーバーを起動すると、読み込まれていないためにアプリがクラッシュします。

たとえば、私のエンジンの gemspec には次の行が含まれています。

s.add_runtime_dependency(%q<rails>, ["= 3.0.7"])
s.add_runtime_dependency(%q<acts_as_commentable>, [">= 3.0.1"])
s.add_runtime_dependency(%q<haml>, [">= 3.1.1"])

.. 親の Rails 3 アプリケーションの Gemfile には次の行があります。

source 'http://rubygems.org'

gem 'my_engine', :path => "~/src/gems/my_engine"

しかし、次のエラーが表示されます。

undefined local variable or method `acts_as_commentable'
from /home/user/src/gems/my_engine/app/models/account.rb:66:in `<class:Account>'

しかしgem 'acts_as_commentable', '>= 3.0.1'、親の Rails 3 アプリの Gemfile に追加すると、gem が読み込まれ、エラーは消えます。

Rails 3.0.8 を使用しています。

誰か提案はありますか?エンジンのロード方法を変更する必要はありますか?

4

4 に答える 4

12

メインの Rails アプリの起動中、Bundler は Gemfile に直接リストされている依存関係のみを必要とし、サブの依存関係は必要としません。それ自体が必要になったときにその依存関係を要求するのは、ライブラリ/エンジンの責任です。これは、Railtie で初期化子を使用して行うことができます。

class MyRailtie < Rails::Railtie
  initializer "require stuff" do
    require "stuff"
  end
end
于 2011-08-07T12:46:53.533 に答える
2

私は Spree (Rails Engine のスーパーヒーロー!) を見ていますspree_core-0.60.1/lib/spree_core.rb

require "rails/all"

require 'state_machine'
require 'paperclip'
require 'stringex'
require 'will_paginate'
require 'nested_set'
require 'acts_as_list'
require 'resource_controller'
require 'active_merchant'
require "meta_search"
require "find_by_param"

答えは、gem 内で、すべての gem 依存関係を 1 つずつ要求する必要があるということです。まぁ、とりあえずそうします。ただし、これが将来変更される場合はコメントしてください。

于 2011-08-06T08:19:38.037 に答える
1

うまくいかないようです。ホスト プロジェクトとサブ プロジェクトを Rails 3 エンジンで作成します。

エンジンの gemspec に gem を追加しました

s.add_dependency 'simple_form'

次に、以下のようにrequireをengine_name.rbに追加しました

require 'simple_form'

ただし、ホスト プロジェクトの Gemfile で [gem 'simple_form'] の行を削除すると、すぐに undefined と表示されます。

于 2011-12-02T11:03:11.707 に答える