繁体   English   中英

在Rails中动态在Concern中定义实例方法

[英]Define instance methods in Concern dynamically on Rails

我只想将用户输入的参数转换为Time对象,所以我试图为此定义一个关注点。

class Foo < ActiveRecord::Base
  include DateAttribute
  attr_date :date_column_1, :date_column_2
end

但是当我写这个问题时,我遇到了一个问题,即如何在模块的class_methods块中定义实例方法。

module DateAttribute
  extend ActiveSupport::Concern

  included do
    class_attribute :_attr_date, instance_accessor: false

    self._attr_date = []
  end

  class_methods do
    def attr_date(*attributes)
      self._attr_date = Set.new(attributes.map(&:to_s))

      # how to dynamic define setter methods by loop attributes here
    end

    def date_attributes
      self._attr_date
    end
  end
end

谢谢。

您可以使用class_eval动态创建方法。

这是一个简单的实现

module DateAttribute
  extend ActiveSupport::Concern

  included do
    class_attribute :_attr_date, instance_accessor: false

    self._attr_date = []
  end

  class_methods do
    def attr_date(*attributes)
      self._attr_date = Set.new(attributes.map(&:to_s))
       attributes.each do |attrib|
        class_eval <<-RUBY
        def #{attrib}(*arguments)
         arguments
        end

        def #{attrib}=(value)
          value
        end
      RUBY
      end
    end

    def date_attributes
      self._attr_date
    end
  end
end

是一篇很好的文章,涉及到此类内容,您可以从“ 动态方法创建”中找到“动态方法创建指南”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM