Rails引擎 – gem的依赖,如何将它们加载到应用程序?

我在这里做一个引擎,它独立工作。

当我把它转换成一个gem,并将其加载到另一个应用程序中时,我得到了很多未定义的错误,来自我的引擎gem的依赖关系。

这是gemspec:

s.add_dependency('paperclip') s.add_dependency('jquery-rails') s.add_dependency('rails3-jquery-autocomplete') s.add_dependency('remotipart') s.add_dependency('cancan') 

在应用程序中,当我进行软件包安装时,它列出了所有这些依赖项,但是当我运行应用程序时,我收到了很多未定义的方法错误(例如来自paperclip的has_attachment)。 看来,应用程序不会加载引擎的依赖关系。 这是默认行为? 我可以改变它吗? 发动机内部的插件也是如此。

如果我手工插入这些gem,在应用Gemfile中,所有的作品…

将它们包含在您的gemfile中并运行bundle install。 然后在你的lib/<your_engine>/engine.rb file需要它们。 不要忘记要求rubygems

  require 'rubygems' require 'paperclip' require 'jquery-rails' require 'rails3-jquery-autocomplete' require 'remotipart' require 'cancan' 

然后在你的主机应用程序(包括你的gem的应用程序)运行捆绑软件安装/捆绑更新(捆绑更新做了我的伎俩),然后一切都应该完美。 您也可以通过在主机应用程序中启动控制台来testing,只需键入模块名称即可

 Loading development environment (Rails 3.0.3) irb(main):001:0> Paperclip => Paperclip 

希望这可以帮助

你可以像Daniel发布的那样手动要求他们,你也可以自动要求他们。 您需要在3个文件中添加依赖关系:

  • yourengine.gemspec

     s.add_dependency "rails", '4.1.0' s.add_dependency "sqlite3" 
  • 的Gemfile

     # Imports dependencies from yourengine.gemspec gemspec 
  • LIB / yourengine.rb

     # requires all dependencies Gem.loaded_specs['yourengine'].dependencies.each do |d| require d.name end require 'yourengine/engine' module Yourengine end 

从回形针的自述文件 :

对于非Rails的用法:

 class ModuleName < ActiveRecord::Base include Paperclip::Glue ... end 

我有同样的问题,并为我修复。

您必须将gem文件添加到.gemspec文件和engine.rb文件中。 在.gemspec文件中,它会是这样的: s.add_dependency "kaminari", "0.16.1"

在顶部的engine.rb文件中添加: require "kaminari"

我想你也需要添加gem到rails引擎Gemfile和bundle install,但是我不确定你是否需要它。

目前(Rails 3.1及以上版本),你不应该在test / dummy / Gemfile中声明任何gem:

引用来自test / dummy / Gemfile(使用rails plugin new my_engine --full ):

在simple_view_helpers.gemspec中声明你的gem的依赖关系。 Bundler将处理运行时依赖关系(如基础依赖关系),而开发依赖关系将默认添加到:development组。

声明任何仍在开发中的依赖关系,而不是在gemspec中。 这些可能包括您的path或Git的边缘Rails或gem。 请记住在将您的gem发布到rubygems.org之前,将这些依赖关系移至您的gemspec。

你真的不应该需要他们的Gemsec,他们应该加载。 当你说“这里是gemspec”时,你用Gem::Specification.new do |s|围绕它 或者是这个效果吧?

你可以用一个简单的bundler命令来包含所有的环境gem:

 Bundler.require(*Rails.groups) 

你可以将其添加到config/initializer