在模型中,我们有以下标志::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方法吗?
答案 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)
如果你不喜欢?运算符,您可以将其分解为一种方法。但是,我不确定除了使用任何特殊的宝石或其他解决方案之外,您在代码简化方面将获得更多收益。
这是我使用直接,可读和简约方法的一种情况。