ruby on rails 3 - Rails Engine: dependencias de gemas, ¿cómo cargarlas en la aplicación?
ruby-on-rails-3 dependencies (7)
Debe agregar el archivo gema tanto al archivo .gemspec como a su archivo engine.rb. En el archivo .gemspec, sería como: s.add_dependency "kaminari", "0.16.1"
En el archivo engine.rb en la parte superior agrega: require "kaminari"
Creo que también debes agregar la gema al motor de rieles Gemfile y la instalación del paquete, pero no estoy seguro si la necesitas allí.
Estoy haciendo un motor aquí, funciona bien solo.
Cuando lo transformo en una gema y lo cargo dentro de otra aplicación, recibo muchos errores indefinidos, provenientes de las dependencias de mi motor.
Aquí está el gemspec:
s.add_dependency(''paperclip'')
s.add_dependency(''jquery-rails'')
s.add_dependency(''rails3-jquery-autocomplete'')
s.add_dependency(''remotipart'')
s.add_dependency(''cancan'')
En la aplicación, cuando hago una instalación de paquete, enumera todas estas dependencias, pero cuando ejecuto la aplicación, recibo muchos errores de métodos no definidos (por ejemplo, has_attachment from paperclip). Parece que la aplicación no carga las dependencias de los motores. ¿Es este el comportamiento predeterminado? ¿Puedo cambiarlo? Lo mismo sucedió con un complemento dentro del motor.
Si inserto a mano esas gemas, en la aplicación Gemfile, todo funciona ...
Inclúyalos en su gemfile y ejecute bundle install. Luego, lib/<your_engine>/engine.rb file
. No olvides solicitar rubygems
require ''rubygems''
require ''paperclip''
require ''jquery-rails''
require ''rails3-jquery-autocomplete''
require ''remotipart''
require ''cancan''
Luego, en su aplicación de host (la aplicación donde incluyó su gema) ejecute el paquete de instalación / paquete de actualización (la actualización del paquete hizo el truco para mí) y luego todo debería funcionar perfectamente. También puede probar esto iniciando la consola en su aplicación de host y simplemente escriba el nombre del módulo, por ejemplo
Loading development environment (Rails 3.0.3)
irb(main):001:0> Paperclip
=> Paperclip
Espero que esto ayude
Por el momento (Rails 3.1 y superior, creo), ya no deberías haber declarado ninguna gema en el test / dummy / Gemfile:
Cita de prueba / dummy / Gemfile (generada con el rails plugin new my_engine --full
):
Declara las dependencias de tu gema en simple_view_helpers.gemspec. Bundler tratará las dependencias de tiempo de ejecución, como las dependencias base, y las dependencias de desarrollo se agregarán de forma predeterminada al grupo de desarrollo.
Declare las dependencias que todavía están en desarrollo aquí en lugar de en su gemspec. Estos pueden incluir bordes de borde o gemas de su ruta o Git. Recuerde mover estas dependencias a su gemspec antes de liberar su gema a rubygems.org.
Puede incluir todas las gemas para el entorno con un simple comando bundler:
Bundler.require(*Rails.groups)
Puede agregar esto a una config/initializer
.
Puede solicitarlos manualmente como Daniel publicó, y también puede solicitarlos automáticamente. Necesita agregar dependencias en 3 archivos:
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
Actualización: es una demostración simplista de cómo requerir las dependencias. Debe probarlo y filtrar elementos no deseados, por ejemplo: require d.name a menos que d.type ==: development (thx @ imsinu9)
Realmente no debería necesitarlos en el Gemsec, y deberían estar cargados. Cuando dices "aquí está el gemspec", lo estás rodeando con Gem::Specification.new do |s|
o algo por el estilo, ¿verdad?
del LÉME de paperclip:
Para uso sin rieles:
class ModuleName < ActiveRecord::Base
include Paperclip::Glue
...
end
Tuve el mismo problema y eso lo solucionó.