簡體   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