Module Mod
# some code... (within an included block)
# require some methods to be implemented by including class
def do_x
raise('not implemented, please override me')
end
def name
raise('not implemented, please override me')
end
end
class Supplier < ApplicationRecord
include Mod
# this overrides do_x of mod
def do_x
# some code...
end
end
从included 块中删除那些似乎对我有用。
https://api.rubyonrails.org/classes/ActiveSupport/Concern.html#method-i-included 解释“在基类的上下文中评估给定块,以便您可以在此处编写类宏。当您定义多个包含块时,它会引发异常。”它通常用于定义关系、范围、验证
一个相关且有用的 Stackoverflow 问题和答案:Ruby modules - included do end block
,具体来说,https://stackoverflow.com/a/28009847/2526423
=======
本地工作示例:
irb(main):070:0> Author.create!
(0.1ms) SELECT sqlite_version(*)
(0.1ms) begin transaction
Author Create (0.5ms) INSERT INTO "authors" ("created_at", "updated_at") VALUES (?, ?) [["created_at", "2020-03-29 22:06:28.202124"], ["updated_at", "2020-03-29 22:06:28.202124"]]
(0.8ms) commit transaction
=> #<Author id: 2, name: nil, year: nil, created_at: "2020-03-29 22:06:28", updated_at: "2020-03-29 22:06:28", uid: nil>
irb(main):071:0> author.name
=> nil
irb(main):072:0> author.do_x
class: do_x
=> nil
app/models/author.rb
require 'do_x_mod'
class Author < ApplicationRecord
include DoXMod
def do_x
puts "class: do_x"
end
end
lib/do_x_mod.rb
module DoXMod
# included do
# some code...
# require some methods to be implemented by including class
def do_x
puts "module: do_x"
raise('not implemented, please override me')
end
def name
puts "module: name"
raise('not implemented, please override me')
end
# end
end