2017-11-12 11 views
0

私は基本的な検索を実装しました。各結果を画像に合わせて表示したいと思います。 私のアプリでcarrierwave gemを使用していて、サムネイルとして最初のものだけを表示するために添付ファイルをループしています。Railsは添付ファイルをループして最初に表示します

<div class="container"> 
    <div class="img-thumbnail" style="display: inline-block;"> 
    <% if @items.present? %> 
     <% @items.each do |item| %> 
     <% item.attachments.each do |attachment| %> 
      <%= image_tag attachment.url(:mini).first unless attachment.blank? %> 
      <% end %> 
     <% end %> 
    <% end %> 
</div> 

create_table "items", force: :cascade do |t| 
    t.string "title" 
    t.string "description" 
    t.datetime "created_at", null: false 
    t.datetime "updated_at", null: false 
    t.json "attachments" 
end 

残念ながら、画像は表示されませんが、エラーは全く空白のサムネイルではありません。どのようにこれを実装するためのアイデア?

+0

'paperclip'や他の宝石を使っていますか?もしそうなら、それをあなたの質問に明記して、タグに入れてください。また、アイテムモデル定義(添付ファイルに関連する部分)を表示できますか? –

+0

返信@AndréGuimarãesSakataさん、ありがとうございました。私の質問にはさらに詳しい情報が追加されました – Theopap

+1

私はキャリアウェーブに慣れていませんが、最初はぼろぼろですが、添付ファイルを繰り返す必要はありません。なぜ行5-8は 'item.attachments.find(&:present?)&。url(:mini)'のようなものではないのですか? – moveson

答えて

1

答えでは、attachmentsを反復し、繰り返しにインデックスを追加します。しかし、反復の唯一の目的は、インデックス== 0の添付ファイルを選択することです。同じことを表現する方が簡単な方法は、attachments[0]を使用してインデックス0の添付ファイルを直接取得することです。もっとRuby-idiomaticになるには、attachments.firstを使うことができます。

私たちは内部の反復を完全に取り除くことができます。 @itemsが存在するかどうかを確認し、itemsを繰り返して、それぞれの最初の添付ファイルを選択してURLを取得するだけです。任意の項目は何の添付ファイルを持っていない場合、これは(あなたのコードがあまりにも意志)失敗すること

<% if @items.present? %> 
    <% @items.each do |item|%> 
     <%= image_tag item.attachments.first.url(:mini) %> 
    <% end %> 
<% end %> 

注:ここでは

は簡易版です。 Rubyのセーフ・ナビゲーション演算子(Ruby 2.3以降で動作)を使用して、これを防ぐことができます。

  <%= image_tag item.attachments.first&.url(:mini) %> 
# This prevents error if `.first` return nil^
+0

@movesonの頭のおかげで!あなたのソリューションも機能しています! – Theopap

関連する問題