質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

Q&A

1回答

278閲覧

子モデルが存在する場合の処理をif文で分岐させてもelseが動作しない

hero_1111

総合スコア13

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Bootstrap

BootstrapはウェブサイトデザインやUIのWebアプリケーションを素早く 作成する可能なCSSフレームワークです。 Twitter風のデザインを作成することができます。

0グッド

0クリップ

投稿2022/04/21 09:33

編集2022/04/26 19:02

質問失礼いたします。

現在railsの学習のためにアプリを作成しているのですが、if文の分岐が思うような挙動にならず困っているため質問させていただきます。

実現したいこと

子モデルの画像がnilの場合、noimageのデフォルト画像を表示させたい。
(現在はテストのためテキスト表示になっています)

親モデル:item
子モデル:item_image

実際の動作

itemを一覧表示させようとindexページにeach文でひとつずつ取り出しているのですが、item_image.imageがnilの場合の処理がなにも行われません。
item_image.image.nil?で画像がない場合の処理を先に書いてもelseの処理は行われますが、nilの処理を行うことができず、ブラウザもなにもないことになっています。

nil blank presentなどを試してもダメだったので、これは親モデルのeach文内で子モデルのカラムのnilを判別できないなど子モデルのデータの取得になにか問題があるのでしょうか?

コード

index.html.erb

ruby

1<div class="container"> 2 <div class="row"> 3 <% @items.each do |item| %> 4 <div class="col-md-4"> 5 <div class="card"> 6 <div class="card-header"> 7 <% item.item_images.each do |item_image| %> 8 <% if item_image.image.nil? %> 9 <h2>イメージ画像はありません</h2> 10 <% else %> 11 <%= image_tag item_image.image.url, class: "card-img-top2" %> 12 <% end %> 13 <% end %> 14 </div> 15 16 <div class="card-body"> 17 <h5 class="card-title"><a href="/items/<%= item.id %>"><%= item.title %></a></h5> 18 <p><%= item.price %></p> 19 <p><%= item.explain %></p> 20 <p><%= item.user_id %>さん</p> 21 </div> 22 </div> 23 24 </div> 25 <% end %> 26 <%= paginate @items %> 27 </div> 28</div>

schema.rb

ruby

1 create_table "item_images", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| 2 t.string "image" 3 t.integer "item_id" 4 t.datetime "created_at", precision: 6, null: false 5 t.datetime "updated_at", precision: 6, null: false 6 end 7 8 create_table "items", charset: "utf8mb4", collation: "utf8mb4_0900_ai_ci", force: :cascade do |t| 9 t.string "title", null: false 10 t.text "explain", null: false 11 t.integer "price", null: false 12 t.bigint "saler_id" 13 t.bigint "buyer_id" 14 t.datetime "created_at", precision: 6, null: false 15 t.datetime "updated_at", precision: 6, null: false 16 t.bigint "user_id" 17 end

item.rb

ruby

1class Item < ApplicationRecord 2 belongs_to :user 3 has_many :item_images, dependent: :destroy 4 5 accepts_nested_attributes_for :item_images, allow_destroy: true 6end

item_image.rb

ruby

1class ItemImage < ApplicationRecord 2 belongs_to :item 3 mount_uploader :image, ImageUploader 4end

何卒よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/04/21 10:07

> nilの場合は処理がされず それは、どのような方法で確認しましたか?
hero_1111

2022/04/21 10:20

<% if item_image.image.nil? %> <h2>イメージ画像はありません</h2> <% else %> <%= image_tag item_image.image.url, class: "card-img-top2" %> <% end %> このときに全てelseの処理に飛んでしまいました。
maisumakun

2022/04/21 10:22

文言を読んで、「ifの側に入るけど、中身の<h2>だけ出力されない」と解釈してしまいました。誤解を招かないように質問文を書き換えておいたほうがいいかと思います。 あと、item_imageはどんなモデル構造でしょうか?
hero_1111

2022/04/21 10:39

ご指摘ありがとうございます。 質問文とschema,モデルファイル追加の編集を行わせて頂きました。 お恥ずかしながらプログラミングについての質問の仕方、有識者の方々へどういったらわかりやすく伝えられるかがあまり理解できていないため、わかりづらくなってしまいすみません。 まだ修正した方が良い点などありましたらお申し付けください。
maisumakun

2022/04/21 10:41

画像アップロードに使っているライブラリはCarrierWaveで間違いないですか?
hero_1111

2022/04/21 10:44

はい。おっしゃる通りでcarrierwaveを使用してimage_uploader.rbをマウントしております。 こちらのファイル等も追加した方がよろしいでしょうか? 今後質問する際は関連するファイルは全て記載させていただくようにします。
guest

回答1

0

CarrierWaveの場合、imageそのものnilになりません。image.file.nil?でチェックしてください。

Note: u.avatar will never return nil, even if there is no photo associated to it. To check if a photo was saved to the model, use u.avatar.file.nil? instead. (CarrierWaveのreadmeより

投稿2022/04/21 10:44

maisumakun

総合スコア145121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hero_1111

2022/04/26 10:02

私用で返信遅れてしまいましたすみません! そうだったのですね。 こちら確認不足でしたありがとうございます。 ただ私の方でimage.file.nil?で試してみたところ前回同様画像が保存されている場合の処理しか行われず、画像がない場合のテキストは表示することができませんでした。 <% item.item_images.each do |item_image| %> <% if item_image.image.file.nil? %> <h2>画像がありません<h2> <% else %> <%= image_tag item_image.image.url, class: "card-img-top2" %> <% end %> <% end %> item_image.imageはnilなのですがやはりモデル間のやりとりになにか問題があるのでしょうか? 以下コンソールでItemImage.allで全てを取り出した際のimageがnilのデータです。 id: 1, image: nil, item_id: 7, created_at: Mon, 29 Nov 2021 18:08:42.380524000 UTC +00:00, updated_at: Mon, 29 Nov 2021 18:08:42.380524000 UTC +00:00>,
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問