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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

828閲覧

Railsでネストした子モデルの画像を表示することができないため質問させてください

hero_1111

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/12/07 10:32

前提・実現したいこと

プログラミング初心者です。はじめて質問させていただきます。
Railsでレッスンモデルで複数画像を投稿するシステムを実装したく以下のような形で実装している最中です。(画像投稿はcarrirwaveを使用しています)

Lesson 親モデル
LessonImage 子モデル
・image
・lesson_id

まず複数投稿を実装する前に画像1枚で投稿できるかテストしている最中に、コンソールでデータベースの中身を確認するとimageカラムに保存はされているもののViewに表示できず、その後も画像の表示方法がわからなかったため質問させていただきました。

簡単な文法ミスとかでしたらすみません。

発生している問題・エラーメッセージ

ネストした子モデルの呼び出し方がいまいちわかりません。
Lessonモデルとは別のUserモデルでは画像の呼び出しはできています。(こちらはUser内にimageカラムを用意してあります)

if文でlesson_imageのimageに画像がある場合は表示されるようにしているのですが、画像が保存されているはずのlessonページにアクセスしても画像が表示されません。

いくつか試してみたのですが、ネストした子モデルの呼び出し方が間違っていると思い確認していただきたいです。

該当のソースコード

lesson.rb

Ruby

1 2class Lesson < ApplicationRecord 3 belongs_to :user 4 has_many :lesson_images 5 6 accepts_nested_attributes_for :lesson_images, allow_destroy: true 7end 8

lesson_image.rb

Ruby

1class LessonImage < ApplicationRecord 2 belongs_to :lesson 3 mount_uploader :image, ImageUploader 4end

lessons_controller.rb(抜粋)

Ruby

1 def show 2 @lesson = Lesson.find(params[:id]) 3 @user = User.find_by(id: @lesson.user_id) 4 @lesson_image = LessonImage.find_by(params[:id]) 5 end 6 7 def new 8 @lesson = Lesson.new 9 @lesson_images = @lesson.lesson_images.build 10 end 11 12 def create 13 @lesson = Lesson.new(lesson_params) 14 if @lesson.save 15 redirect_to lessons_path 16 else 17 render :new 18 end 19 end 20 21 def edit 22 end 23 def update 24 if @lesson.update(lesson_params) 25 redirect_to lessons_path 26 else 27 render :edit 28 end 29 end 30 31 private 32 def lesson_params 33 params.require(:lesson).permit(:title,:explain,:price,lesson_images_attributes: [:id, :lesson_id, :image]).merge(user_id: current_user.id) 34 end 35

レッスンのshow.html

Ruby

1<p><%= @lesson.title %></p> 2<p><%= @lesson.price %></p> 3<p><%= @lesson.explain %></p> 4<p><%= @lesson.user_id %></p> 5 6 <% if @lesson_image.image.blank? %> 7 <%= image_tag "" %> 8 <% else %> 9 <%= image_tag @lesson_image.image.url %> 10 <% end %> 11 12<% if @lesson.user_id == current_user.id %> 13 <%= link_to "編集", edit_lesson_path %> 14<% end %>

試したこと

if文を消して直接image_tagを使用するとArgumentErrorになるため、子モデルの中身の渡し方がいけないのかと思っているのですが、いまいち原因をつかめていません。

大変初歩的な質問かもしれませんが、回答いただけますと助かります。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

Rails 6.1.4.1
ruby 3.0.2

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

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

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

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

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

guest

回答1

0

ベストアンサー

Lesson と LessonImage は1:多ですから
@lesson_image = LessonImage.find_by(params[:id])
ではなく、
@lesson_images = Lesson.lesson_images
と全部取ってくる方が良いでしょう。
<% if @lesson_image.image.blank? %>..<% end %>

<% if lesson_image.image.blank? %>..<% end %>
にして、これを
<% @lesson_images.each do |lesson_image| %> .. <% end %>で囲む。
ただ、一つだけ表示するか全部表示するかの違いなので本質は変わりません。
ifがelseに行ってしまうとすると、imageが本当に格納されているか、を確認するのが良いでしょう

投稿2021/12/07 13:54

winterboum

総合スコア23416

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

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

hero_1111

2021/12/09 20:48

回答ありがとうございます!大変助かりました。 @lesson_images = Lesson.lesson_images だとnoMethoderrorになってしまったので、@lesson.lesson_imagesにしてwinterboum様にご提案いただいたようにeach文で囲ったところちゃんと表示することができました! 本当にありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問