Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何编写跨越模型、控制器和视图的Rails mixin_Ruby On Rails_Ruby_Refactoring_Dry - Fatal编程技术网

Ruby on rails 如何编写跨越模型、控制器和视图的Rails mixin

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

为了减少我的小Rails应用程序中的代码重复,我一直在努力将我的模型之间的通用代码放到它自己的单独模块中,到目前为止还不错

模型内容相当简单,我只需要在开始时包含模块,例如:

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)