2012-04-28 54 views
9

在Rails視圖,可以使用try只輸出是否存在於數據庫中的值,例如如何在Rails中鏈接try()和scoped to_s()?

@model.try(:date) 

並且人們可以鏈改掉如果,例如,輸出需要作爲字符串

@model.try(:date).try(:to_s) 

但是如果我需要調用scoped格式呢?我試過

@model.try(:date).try(:to_s(:long)) 
@model.try(:date).try(:to_s).try(:long) 

這是什麼正確的語法?什麼是更多解釋的好參考?

由於

回答

14

fine manual

嘗試(*一個,& 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方法。

+0

現貨!謝謝! – 2012-04-28 04:41:07

4

mu is too short's answer顯示了try方法與參數的正確用法:

@model.try(:date).try(:to_s, :long) 

但是,如果你正在使用Ruby 2.3或更高版本,您應停止使用try,給航行安全運營一試(沒有雙關語意):

@model&.date&.to_s(:long) 

以下答案就在這裏歷史的目的 - 增加一個rescue nil到語句的結束是considere d不好的做法,因爲它抑制所有異常:

對於長鏈,可以失敗,我寧願使用:

@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

+0

感謝法比奧,這是非常有用的信息。我學到了一些新東西。 – 2012-04-28 17:02:54

+2

避免營救零,除非你有120%確定你沒有錯過任何其他的錯誤,你也不關心性能(提高:例外是緩慢的) – 2016-11-04 20:20:00

+1

你是對的@SimonB。不幸的是,2012年我第一次發佈答案時,我並不知道它。我已經編輯它,感謝您的注意。 – 2016-11-05 00:38:09

2

如果你經常使用的嘗試沒有塊鏈,一種選擇是延長對象種類:

class Object 
    def try_chain(*args) 
    args.inject(self) do |result, method| 
     result.try(method) 
    end 
    end 
end 

然後只需使用@model.try_chain(:date, :to_s)