9

在 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)

什么是正确的语法?什么是更多解释的好参考?

谢谢

4

3 回答 3

15

来自精美手册

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定义方法。

于 2012-04-28T04:14:45.473 回答
5

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

于 2012-04-28T06:16:51.750 回答
2

如果你经常使用没有块的 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)

于 2014-08-08T13:30:53.847 回答