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 method在my\u method使用blockmy\u method{:arg\u 3}
> Model.last.instance_method
=>[{:attr=> #<Proc:0x00 ... >}]
>Model.last.instance\u方法
=>[{:attr=>#}]
如何根据实例状态输入my_方法参数?例如,
@model.instance\u方法
应返回:arg\u 3 ifmodel.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