[英]How to chain try() and scoped to_s() in Rails?
在Rails视图中,只有在数据库中存在值时才可以使用try
输出,例如
@model.try(:date)
例如,如果输出需要作为字符串,则可以链接trys
@model.try(:date).try(:to_s)
但是如果我需要调用范围格式呢? 我试过了
@model.try(:date).try(:to_s(:long))
@model.try(:date).try(:to_s).try(:long)
这个的正确语法是什么? 什么是更好解释的好参考?
谢谢
从精细手册 :
试试(* 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)
因为你试图在什么to_s
返回上调用long
方法,你可能没有定义String#long
to_s
方法。
mu太短了答案显示了带参数的try
方法的正确用法:
@model.try(:date).try(:to_s, :long)
但是,如果您使用的是Ruby 2.3或更高版本,则应该停止使用try
并try
安全导航操作符(无双关语):
@model&.date&.to_s(:long)
以下答案出于历史目的 - 在语句末尾添加一个rescue nil
被认为是不好的做法,因为它会抑制所有异常:
对于可能失败的长链,我宁愿使用:
@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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.