Ruby on rails Rails关注点:带块的类方法

Ruby on rails Rails关注点:带块的类方法,ruby-on-rails,ruby,metaprogramming,Ruby On Rails,Ruby,Metaprogramming,我正在尝试编写类方法我的_方法(就像验证),它使用代码块 模型包含下一个代码: class Model < ActiveRecord::Base include Usable my_method :arg_1, :arg_2 my_method do |model| # just for example if model.attribute.present? :arg3 else :arg4 end end #

我正在尝试编写类方法我的_方法(就像验证),它使用代码块

模型包含下一个代码:

class Model < ActiveRecord::Base
  include Usable
  my_method :arg_1, :arg_2

  my_method do |model|
    # just for example 
    if model.attribute.present?
      :arg3
    else
      :arg4
    end
  end
  #...
end
但是instance\u methodmy\u method使用block
my\u method{:arg\u 3}

> Model.last.instance_method
=>[{:attr=>   #<Proc:0x00 ... >}]
>Model.last.instance\u方法
=>[{:attr=>#}]

如何根据实例状态输入my_方法参数?例如,
@model.instance\u方法
应返回:arg\u 3 if
model.attribute.present?

问题已通过解决。 我重写了instance_方法,如下所示:

  def instance_method
    class_attrs = self.class.display_attrs.map { |n| n[:attr] }
    class_blocks = self.class.display_attrs.map { |n| n[:block].call(self) if n[:block] }
    (class_attrs + class_blocks).compact!
  end

  module ClassMethods
  #...
       display_attrs << { block: block} if block_given?
  #...
  end
def实例_方法
class|attrs=self.class.display|attrs.map{n | n[:attr]}
class|blocks=self.class.display_attrs.map{| n | n[:block]。如果n[:block]},则调用(self)
(类属性+类块)。紧凑!
结束
模块类方法
#...
显示属性
> Model.last.instance_method
=>[{:attr=>   #<Proc:0x00 ... >}]
  def instance_method
    class_attrs = self.class.display_attrs.map { |n| n[:attr] }
    class_blocks = self.class.display_attrs.map { |n| n[:block].call(self) if n[:block] }
    (class_attrs + class_blocks).compact!
  end

  module ClassMethods
  #...
       display_attrs << { block: block} if block_given?
  #...
  end