将模型方法从Rails应用程序移动到gem

时间:2016-09-23 13:33:05

标签: ruby rubygems ruby-on-rails-5

我在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不幸地说了很多。

有什么想法吗?

1 个答案:

答案 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_manybelongs_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