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