Я хочу поделиться моделью между 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