2017-04-11 10 views
1

Railsでaslsx gemを使用してExcelファイルを生成しています。私のテンプレートでRails 5で値が利用可能な場合にのみメソッドの値を使用します

私が持っている:

wb = xlsx_package.workbook 
wb.add_worksheet(name: "Buttons") do |sheet| 
    sheet.add_row ['Id', 'Data', 'Passenger'] 
    @rides.each do |ride| 
     sheet.add_row [ride.id, ride.date, ride.passenger.name] 
    end 
end 

問題は、いくつかの乗り物が乗客を持っていないということですので、.nameのメソッドが失敗します。 乗り物が存在するときに、どのようにして名前メソッドしか使用できないようにすることができますか?

私が試した:

sheet.add_row [ride.id, ride.date, ride.passenger.name if ride.passenger] 

をしかし、これは動作しませんでした。

答えて

1

Rubyはかなり柔軟ですが、このような状況ではifを使用できません。代わりに2つのオプションがあります。

[ride.id, ride.date, ride.passenger&.name] 

歳以上のもののために:あなたは、条件付きナビゲーション演算子を使用することができますルビーの新しい(2.3以降)のバージョンについては

[ride.id, ride.date, ride.passenger && ride.passenger.name] 

通常x && yy if xとほぼ同等です。

+0

私はこの部分が好きです。「ride.passenger&.name'。ソースを共有して、どこでこれらの新機能を見つけることができますか? – 7urkm3n

+0

セーフナビゲーションオペレータ(https://en.wikipedia.org/wiki/Safe_navigation_operator)と呼ばれています。 – tadman

1

オプションの場合、最も古い行を表示できます。

name = ride.passenger ? ride.passenger.name : "" 
sheet.add_row [ride.id, ride.date, name] 

#OR 
sheet.add_row [ride.id, ride.date, ride.passenger ? ride.passenger.name : ""] 
3

あなたは、単に乗客がある何の乗客と乗客の名前が存在しない場合、これはnilを返します

sheet.add_row [ride.id, ride.date, ride.passenger.try(:name)] 

を行うことができます。

documentationの詳細情報

関連する問題