Ruby on rails 如何编写跨越模型、控制器和视图的Rails mixin
为了减少我的小Rails应用程序中的代码重复,我一直在努力将我的模型之间的通用代码放到它自己的单独模块中,到目前为止还不错 模型内容相当简单,我只需要在开始时包含模块,例如:Ruby on rails 如何编写跨越模型、控制器和视图的Rails mixin,ruby-on-rails,ruby,refactoring,dry,Ruby On Rails,Ruby,Refactoring,Dry,为了减少我的小Rails应用程序中的代码重复,我一直在努力将我的模型之间的通用代码放到它自己的单独模块中,到目前为止还不错 模型内容相当简单,我只需要在开始时包含模块,例如: class Iso < Sale include Shared::TracksSerialNumberExtension include Shared::OrderLines extend Shared::Filtered include Sendable::Model validates_p
class Iso < Sale
include Shared::TracksSerialNumberExtension
include Shared::OrderLines
extend Shared::Filtered
include Sendable::Model
validates_presence_of :customer
validates_associated :lines
owned_by :customer
def initialize( params = nil )
super
self.created_at ||= Time.now.to_date
end
def after_initialize
end
order_lines :despatched
# tracks_serial_numbers :items
sendable :customer
def created_at=( date )
write_attribute( :created_at, Chronic.parse( date ) )
end
end
基本上,我计划只对控制器和视图执行include-Sendable::Controller和Sendable::View(或等效的)操作,但是,有没有更干净的方法呢?我正在寻找一种在我的模型、控制器和视图之间拥有一堆公共代码的简洁方法
编辑:澄清一下,这只需要在2或3个模型中共享。如果需要将该代码添加到所有模型和所有控制器中,您可以始终执行以下操作:
# maybe put this in environment.rb or in your module declaration
class ActiveRecord::Base
include Iso
end
# application.rb
class ApplicationController
include Iso
end
如果您需要此模块中的函数可用于视图,则可以使用application.rb中的helper\u方法
声明将其单独公开。您可以将其插件化(使用脚本/生成插件)
然后在init.rb中执行如下操作:
ActiveRecord::Base.send(:include, PluginName::Sendable)
ActionController::Base.send(:include, PluginName::SendableController)
和你自己一起,这应该很好
检查一些acts插件,这是一种非常常见的模式(,检查第30行)如果您选择插件路线,请检查,这旨在以清晰的方式将插件语义扩展到控制器和视图 这就是我最终可能要做的,只要我的函数等没有任何名称冲突,这应该不会是一个问题。我已经选择了这个答案,尽管Hoyhoy的也很好,只是因为它更适合我正在做的事情。这真的是一样的。这是一个更好的语法。我快速浏览了一下,这可能会解决我的问题。但我不太确定我是否处于这个阶段。
ActiveRecord::Base.send(:include, PluginName::Sendable)
ActionController::Base.send(:include, PluginName::SendableController)