2012-04-28 13 views
9

、1は例えば、出力が文字列として必要とされ、場合、データベース内の値、例えばRailsでtry()とスコープto_s()をチェーンするには? Railsのビューで

@model.try(:date) 

そして、1缶チェーンtrysがある場合にのみ、出力にtryを使用することができます

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

しかし、スコープ形式を呼び出す必要がある場合はどうすればよいですか。私は試しました

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

正しい構文は何ですか?そして、より詳しい説明のための良い参考資料は何ですか? fine manualから

おかげ

答えて

14

試し(*、& B)
[...]
tryものために、引数および/またはブロックを受け入れます方法しようとしています

Person.try(:find, 1) 

だから私は、あなたがしたいと思う:

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

この1つは動作しません。

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

をあなたが方法(:to_s(:long))として:to_sシンボルにアクセスしようとしているので。あなたは何to_sリターンにlongメソッドを呼び出すようにしようとしているので、

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

、あなたはおそらくString#longメソッドが定義されていない:この1は動作しません。何のしゃれ(あなたはルビー2.3以降を使用している場合は、あなたがtryの使用を停止し、安全なナビゲーション演算子を試してみる必要があります

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

+0

spot on!ありがとう! –

4

mu is too short's answerは、パラメータを持つ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

Fabioに感謝します。これは本当に有用な情報です。私は何か新しいことを学んだ。 –

+2

あなたが他のエラーを逃していないと確信していない場合は、レスキューゼロを避けてください。また、パフォーマンスについて気にしないでください(例外:例外が発生するのが遅い) –

+1

あなたは@SimonBです。残念ながら、2012年に最初に答えを投稿したとき、私はそれについて知りませんでした。私はそれを気付いて編集しました。 –

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)

関連する問題