【问题标题】:Define multiple setter methods in concern with custom names定义多个与自定义名称有关的 setter 方法
【发布时间】:2017-03-22 13:18:09
【问题描述】:

我想定义多个自定义方法来为 UserConcern 中的自定义用户字段设置值,这些字段不存储在数据库中,而是从外部源中获取。我尝试了下面的代码,结果是 ``': undefined local variable or method get_custom_attrs' for UserConcern:Module (NameError)

get_custom_attrs.each do |key|
  define_method(key) do
    // returning the value for this key
  end
end

private

def get_custom_attrs
  OuterConcern::FIELDS - User.attribute_names
end

我显然不能在顶层使用这种方法。如果我切换到在关注点中使用常量变量,例如CUSTOM_FIELDS = [:custom1, custom2, ...],它会起作用,但它不是动态的,每次更改、添加或删除字段时我都必须更改它。

【问题讨论】:

  • 我根本看不到这里定义了 get_attrs 方法,但您可以使用 attr_accessor *get_custom_attr 为定义的键创建虚拟属性(因为您在帖子中说过要设置值和您的代码建议检索。
  • 这是一个错字。修好了,应该是get_custom_attrs

标签: ruby-on-rails ruby


【解决方案1】:

get_custom_attrs 在类级别执行,而def get_custom_attrs 在实例级别定义方法。你需要 get_custom_attrs 作为类方法存在,所以你想要类似的东西

class MyAwesomeClass
  class << self
    private
    def get_custom_attrs
      [:a1,:a2,:a3] # or whatever
    end
  end
  get_custom_attrs.each do |attr|
    # Some stuff happens here
  end
end

【讨论】:

  • 如何保留将get_custom_attrs 方法设为私有的原始想法?
  • 如果我想在类级别和实例级别使用它怎么办?我需要在另一种方法中使用它,它不起作用。
  • @abpetkov,通常对于这样的事情我有类似def the_method; self.class.the_method; end的东西,但是Ruby中私有方法的定义是它不能用接收器调用,所以会抛出异常.在这种情况下,get_custom_attrs 实际上不是私有方法,或者您完全确定它是私有方法,但仍想通过使用 send 来解决这个问题,因此您可以编写类似 def the_method; self.class.send(:the_method); end 的内容
  • @ymbirrt 还有别的东西,包含符号数组的 OuterConcern:: FIELDS 出于某种原因将无法工作。正如您提到的那样对数组进行硬编码会起作用,但这不是我想要做的。
  • @abpetkov, [:a1, :a2, :a3] 可以替换为任意代码,我的答案中的片段只是一个示例。请注意,它将在定义类时执行,之后不再执行。至于OuterConcern::FIELDS由于某种原因无法工作,恐怕我无法调查,这听起来像是一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-31
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 2023-01-19
相关资源
最近更新 更多