Ruby 使方法足够灵活,以;“知道”;它是哪个字段';他申请了什么?

Ruby 使方法足够灵活,以;“知道”;它是哪个字段';他申请了什么?,ruby,methods,Ruby,Methods,在一个模型中,我们有以下标志::hidden,:phone和:email 我想编写一个名为public\u view的方法,它返回“HIDDEN”或它应用于的任何字段的值,而不必传入DNC标志 因此,@user.email.public_view基于@user.HIDDEN返回:email或“HIDDEN”,而@user.phone.public_view基于@user.HIDDEN返回:phone或“HIDDEN” 比如: def public_view self.SOMETHING.hi

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

我想编写一个名为
public\u 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

我怀疑有一种非常好的class/Ruby方法可以做到这一点?

如果您不喜欢?操作符,你当然可以把它分解成一个方法。然而,除了使用任何特殊的gems或其他解决方案之外,我不确定您在代码简化方面会获得多少好处


在这种情况下,我会使用直接的、可读的、最低限度的方法。

听起来您需要一种动态方法来处理字段的公共视图方面

它的api不是
@user.email.public\u view
,因为这需要
public\u 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>

很好的回答,谢谢。。。我不知道为什么我单击“接受”时stackoverflow会忽略单击。
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