1

我正在制作一个插件,我需要它来覆盖我的模型的 setter/getter。这是我到目前为止的代码:

module Iplong
    extend ActiveSupport::Concern

    module ClassMethods
        ...

        def override_setter
            self.class_eval %(
                def #{attribute}=(raw_value)
                    self[:#{attribute}] = #{ip2long('raw_value')}
                end
            )
        end
    end

end

ActiveRecord::Base.send :include, Iplong

注意raw_value参数。如果我在评估代码中打印它,它会打印设置属性时出现的正确值,但是如果我在ip2long发送它的函数内打印它,它会返回一个字符串:raw_value那么我如何传递这个参数而不将它解释为字符串?

4

1 回答 1

0

您的问题出在这段特定的代码中:

"#{ip2long('raw_value')}"

将其从字符串转换为 Ruby 代码,您将获得:

ip2long('raw_value')

因此,您实际上是在发送“raw_value”字符串而不是该变量的实际值。

将代码替换为:

"#{ip2long(raw_value)}"

你应该没事。

编辑:此示例代码显示了它是如何工作的:

class A
  attr_accessor :ip

  def ip2num(ip)
    ip.gsub(".", "")
  end

  def override(attr)
    code = "def #{attr}=(value); @ip = ip2num(value); end"
  self.class.class_eval(code)
  end
end

a = A.new
a.ip = "0.0.0.0"
puts a.ip

a.override("ip")
a.ip = "0.0.0.0"
puts a.ip
于 2012-07-13T17:23:36.017 回答