Подтвердить что ты не робот

Rails Engine - зависимости Gems, как загрузить их в приложение?

Я делаю двигатель здесь, он работает хорошо в одиночестве.

Когда я превращаю его в драгоценный камень и загружаю его в другое приложение, я получаю много ошибок undefined, исходящих из моих зависимостей gem engine.

Вот пример gemspec:

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

В приложении, когда я устанавливаю пакет, он перечисляет все эти зависимости, но когда я запускаю приложение, я получаю много ошибок undefined методов (например, has_attachment из paperclip). Похоже, что приложение не загружает зависимости от двигателей. Это поведение по умолчанию? Могу я его изменить? То же самое произошло с плагином внутри двигателя.

Если я вставляю вручную эти драгоценные камни, в приложении Gemfile все работает...

4b9b3361

Ответ 1

Включите их в свой gemfile и запустите установку пакета. Затем требуйте их в lib/<your_engine>/engine.rb file. Не забудьте потребовать рубигемы

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

Затем в вашем хост-приложении (приложение, в которое вы включили свой драгоценный камень) запустите пакет install/bundle update (пакетное обновление сделало трюк для меня), а затем все должно работать отлично. Вы также можете проверить это, запустив консоль в своем хост-приложении и просто введите имя модуля, например.

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

Надеюсь, что это поможет

Ответ 2

Вы можете потребовать их вручную, как отправленный Daniel, и вы также можете потребовать их автоматически. Вам нужно добавить зависимости в 3 файла:

  • yourengine.gemspec

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

    # Imports dependencies from yourengine.gemspec
    gemspec
    
  • Библиотека/yourengine.rb

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

Ответ 3

from paperclip README:

Использование Non-Rails:

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

У меня была такая же проблема, и я исправил ее для меня.

Ответ 4

Вы должны добавить файл gem в файл .gemspec и файл engine.rb. В файле .gemspec это будет выглядеть так:   s.add_dependency "kaminari", "0.16.1"

В файле engine.rb вверху добавить:   require "kaminari"

Я думаю, вам также нужно добавить драгоценный камень в движок gimfile и установить пакет, но я не уверен, что вам это нужно.

Ответ 5

В настоящее время (Rails 3.1 и выше, я думаю), вам больше не нужно было объявлять какие-либо драгоценные камни в файле test/dummy/Gemfile:

Цитата из test/dummy/Gemfile (сгенерирована с помощью rails plugin new my_engine --full):

Объявите свои зависимости от gem в simple_view_helpers.gemspec. Bundler будет обрабатывать зависимости времени выполнения, такие как базовые зависимости, и зависимостей разработки будут добавлены по умолчанию в группу: development.

Объявить любые зависимости, которые все еще находятся в разработке здесь, а не в ваш gemspec. К ним могут относиться ребра Rails или драгоценные камни с вашего пути или Git. Не забудьте переместить эти зависимости в ваш gemspec перед выпуском ваш драгоценный камень на rubygems.org.

Ответ 6

Вам действительно не нужны они на Gemsec, и они должны быть загружены. Когда вы говорите "вот гемспик", вы окружаете его с помощью Gem::Specification.new do |s| или что-то в этом роде, верно?

Ответ 7

Вы можете включить все камни для среды с помощью простой команды bundler:

Bundler.require(*Rails.groups)

Вы можете добавить это к config/initializer.