繁体   English   中英

如何在Rails中链接try()和scoped to_s()?

[英]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或更高版本,则应该停止使用trytry安全导航操作符(无双关语):

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM