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

Совместное использование модели mongoid между двумя приложениями - использование движка против плагина

Я хочу поделиться моделью между 2 (возможно, больше в будущем) моих приложений-рельсов. Я не мог найти никаких ясных предложений, но я взял некоторые из вопросов и ответов, которые я прочитал, и пришел к выводу, что это нужно сделать с помощью "gemmed" плагина. Я решил пойти с плагином, потому что я читал, что этот движок просто своего рода "полный" плагин.

Итак, я создал плагин, используя: rails plugin new my_models --skip-active-record --skip-test-unit --dummy-path=spec/dummy (параметры для пропуски activerecord как ORM и использования rspec для тестирования).

После создания плагина я получил следующие файлы:

my_models.gemspec  Gemfile  Gemfile.lock  lib  MIT-LICENSE  Rakefile  README.rdoc  spec

Я попытался включить модель, используя следующие методы:

  • Просто создав каталог app/models и разместив мою модель внутри
  • Как было предложено в этом учебнике (и я мог видеть в devise github), я создал генератор в попытке генерировать модель.

Оба из них потерпели неудачу, и затем я решил пойти с предложением двигателя (просто добавив --mountable в список опций команды "rails new" ), я получил полную структуру приложений rails (с приложением, bin, db и остальные каталоги), поместите мою модель в каталог app/models, и она работает как волшебство!

Как я считаю, я программист, а не я волшебник, я не делаю таких магов, так что вы можете сказать мне, что не так с обоими из моих тонких плагинов (с использованием генератора/создания модели)? Более того, каковы преимущества использования этих генераторов?

Я прилагаю код генератора, возможно, я что-то пропустил:

require 'rails/generators/named_base'
require 'mongoid'

module Mongoid
  module AttackGenerator
    def generate_model
      invoke "mongoid:model", [name] unless model_exists? && behavior == :invoke
    end

    def inject_field_types
      inject_into_file model_path, migration_data, after: "include Mongoid::Document\n" if model_exists?
    end

    def migration_data
      field :link_url, type: String
      field :token, type: String
    end

    def model_exists?
      File.exists?(File.join(destination_root, model_path))
    end

    def model_path
      @model_path ||= File.join("app", "models", "#{file_path}.rb")
    end
  end
end
4b9b3361

Ответ 1

An engine (очень хорошее руководство) - это в основном небольшое приложение Rails: имеет контроллеры, может вводить в ваш код рельсов различными способами (совместное использование классов/контроллеров и т.д.) и, самое главное, может использовать ваш основной код приложения Rails прозрачно.

Подумав немного об этом, я считаю, что вам нужен двигатель, причина в том, что простая модель все еще требует миграции. Обратите внимание, что двигатель в основном представляет собой драгоценный камень, а также несколько дополнений, предоставляемых рельсами.

Хотя miguiding (плагины в рельсах больше не используются), команда rails plugin new blorgh --mountable создает gem, который является движком рельсов.

Как вы понимаете, является ли драгоценный камень рельсовым двигателем? По файлу engine.rb (можно назвать иначе, содержимое - важный материал).

module Blorgh
  class Engine < ::Rails::Engine
    isolate_namespace Blorgh
  end
end

Еще одна важная вещь, о которой вам следует знать, - это то, что для вашего gemfile добавлен ваш собственный камень в качестве рельсов (фактически Bundler.require) auto require один файл: файл с именем lib/yourgemname.rb, в этом случае lib/blorgh.rb. Это ваша точка входа. Помимо этого, все другие вещи (gemspec и все другие файлы) - это вещи, созданные для рубигемов. Важная часть состоит в том, что вы используете файл .gemspec в качестве своего gemfile, просто добавьте драгоценные камни, используя add_dependency вместо стандартного синтаксиса Gemfile. Если вы хотите (и вы должны) узнать больше о драгоценных камнях ruby, эта статья действительно хороша

Каталог app автоматически загружается как рельсы, поэтому добавление app/models/yourmodel.rb - это хороший способ, чтобы ваша модель автоматически загружалась и делилась со всеми вашими приложениями. Последнее важное, это миграции. Вы должны не забудьте запустить your_engine_name:install:migrations в своем приложении Rails, чтобы скопировать ваши миграции с вашего движка в ваше приложение rails и запустить их (в противном случае вы можете увидеть предложения эта статья)

И вы готовы. Одна запись! Для установки вашего драгоценного камня у вас есть два варианта: используйте удаленный репозиторий git (лучший вариант) или для локальной разработки вы можете использовать :path, здесь два примера, которые можно добавить в ваши GEM файлы Rails:

# Use this only for development purposes
gem 'yourgem', '1.0.0', path: 'your/local/path/to/gem'

# Use this for deploy and such, you'll need access to that repository
gem 'yourgem', '1.0.0', git: 'yourgiturl'

Этого должно быть достаточно