我在Rails 5上创建了一个gem。
让我说SomeModel
采用hello
方法,我在myengine
内使用
# app/models/myengine/someModel.rb
module Myengine
class SomeModel < ApplicationRecord
def self.hello
puts 'hello world'
end
end
end
我想从默认应用程序中移除hello
方法并将其存储到gem 中,以便我可以在需要时将其插入。
我既不知道要写什么来扩展模型,也不知道在哪里放置该文件。
我试图通过Rails guidelines,但它们太复杂了!几次尝试后我迷路了。 我不需要单表继承,我需要扩展该特定模型。
已经尝试this answer似乎不太正确了,this one不幸地说了很多。
有什么想法吗?
答案 0 :(得分:1)
好的,在挖掘网页并将头撞在墙上后,我终于得出结论。
假设您要在默认应用引擎SomeModel
中扩展myengine
的功能:
# app/models/myengine/some_model.rb
module Myengine
class SomeModel < ApplicationRecord
# some code
end
end
您可以在config/intializers
文件夹或lib/myplugin
文件夹中执行此操作。我展示了两个,第一个是关注方式,第二个是自我方式。
在您的宝石中,您可以使用关注扩展SomeModel
添加hello
方法:
# myplugin/config/initializers/some_model_extension.rb
module Myplugin::SomeModelExtension
extend ActiveSupport::Concern
class_methods do
def hello
return "Hello world!"
end
end
end
class Myengine::SomeModel < ActiveRecord::Base
include Myplugin::SomeModelExtension
end
您可以更新ClassMethods
,但同样适用于InstanceMethods
(如果您不了解实例方法和类方法之间的区别,则应read this)。
如果您想添加has_many
或belongs_to
等关联,可以将included do
用作this guy did。
这也适用
# myplugin/lib/myplugin/some_model_extension.rb
module SomeModelExtension
def self.included(base)
base.extend ClassMethods
end
module ClassMethods
def hello
return 'Hello world'
end
end
end
class Myengine::SomeModel < ActiveRecord::Base
include SomeModelExtension
end
# myplugin/lib/myplugin.rb
require 'myplugin/some_model_extension'
如果您想了解更多信息,请查看Rails Guidelines。
还值得查看awesome answer。