使方法足够灵活,以“知道”它应用于哪个字段?

时间:2011-02-07 22:44:20

标签: ruby methods

在模型中,我们有以下标志::hidden:phone:email

我想写一个名为public_view的方法,它返回“HIDDEN”或它应用的任何字段的值,而不必传入DNC标志。

因此,@user.email.public_view会根据@user.hidden返回:email或“HIDDEN”,@user.phone.public_view会根据@user.hidden返回:phone或“HIDDEN”

类似的东西:

def public_view
  self.SOMETHING.hidden ? "HIDDEN" : self.SOMETHINGELSE
end

我怀疑有一些非常好的类/ Ruby方法吗?

2 个答案:

答案 0 :(得分:2)

听起来你想要一个动态方法来处理字段的public_view方面。

它的api不会是@user.email.public_view,因为这需要public_view成为email字段类的方法。相反,像这样:

@user.public_view_email # returns either the value of the #email method
                        # or "HIDDEN", depending on the #hidden attribute

@user.public_view_phone 
# more generally, handle ALL fields in the form: @user.public_view_<field name>

怎么做 使用method_missing方法处理方法。这与Active Record find_by_foo动态方法使用的技术相同。这是blog post

未经测试的示例:

class User < ActiveRecord::Base
  def method_missing(method, *args)
    if method.to_s =~ /^public_view_(.*)$/
      hidden ? "HIDDEN" : send $1
    else
      super
    end
  end

  # also handle responds_to?
  def respond_to?(method, include_private = false)
    if method.to_s =~ /^public_view_(.*)$/
      true
    else
      super
    end
  end
end

答案 1 :(得分:0)

如果你不喜欢?运算符,您可以将其分解为一种方法。但是,我不确定除了使用任何特殊的宝石或其他解决方案之外,您在代码简化方面将获得更多收益。

这是我使用直接,可读和简约方法的一种情况。