[英]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.