在 Rails 视图中,try
只有在数据库中有值时才能使用输出,例如
@model.try(:date)
例如,如果需要将输出作为字符串,则可以进行链式尝试
@model.try(:date).try(:to_s)
但是如果我需要调用作用域格式怎么办?我试过了
@model.try(:date).try(:to_s(:long))
@model.try(:date).try(:to_s).try(:long)
什么是正确的语法?什么是更多解释的好参考?
谢谢
在 Rails 视图中,try
只有在数据库中有值时才能使用输出,例如
@model.try(:date)
例如,如果需要将输出作为字符串,则可以进行链式尝试
@model.try(:date).try(:to_s)
但是如果我需要调用作用域格式怎么办?我试过了
@model.try(:date).try(:to_s(:long))
@model.try(:date).try(:to_s).try(:long)
什么是正确的语法?什么是更多解释的好参考?
谢谢
来自精美手册:
try(*a, &b)
[...]
try
也接受参数和/或块,用于它正在尝试的方法Person.try(:find, 1)
所以我想你想要:
@model.try(:date).try(:to_s, :long)
这个不行:
@model.try(:date).try(:to_s(:long))
因为您试图将:to_s
符号作为方法 ( :to_s(:long)
) 访问。这个不行:
@model.try(:date).try(:to_s).try(:long)
因为您试图long
在返回的内容上调用该方法,to_s
并且您可能没有String#long
定义方法。
mu is too short's answertry
显示了带参数的方法的正确用法:
@model.try(:date).try(:to_s, :long)
但是,如果您使用的是 Ruby 2.3 或更高版本,则应停止使用try
并尝试使用安全导航运算符(不是双关语):
@model&.date&.to_s(:long)
以下答案是出于历史目的 -rescue nil
在语句末尾添加 a 被认为是不好的做法,因为它会抑制所有异常:
对于可能失败的长链,我宁愿使用:
@model.date.to_s(:long) rescue nil
而不是用电话来填充我的视图
try(...)
。另外,尝试使用
I18n.localize
日期格式,如下所示:l @model.date, format: :long rescue nil
请参阅: http ://rails-bestpractices.com/posts/42-use-i18n-localize-for-date-time-formating
如果你经常使用没有块的 try 链,一个选项是扩展 Object 类:
class Object
def try_chain(*args)
args.inject(self) do |result, method|
result.try(method)
end
end
end
然后只需使用@model.try_chain(:date, :to_s)