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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Q&A

解決済

1回答

1272閲覧

画像投稿時にimageの定義がないエラーが起きてしまいます。

jm_swim

総合スコア8

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

0グッド

0クリップ

投稿2021/01/03 05:19

編集2021/01/04 01:12

前提・実現したいこと

現在投稿アプリを作成しています。
active storage、carrierwaveを導入して画像,動画投稿を可能にしたいのですが、現在エラーが出て詰まっています。

行ったこととしては、
・active storage導入
・has_one_attachedの記述
・コントローラーで受け取る情報の定義
・ビューでの表示させる記述(エラー文参照)
になります。

rails初心者です。お力添えをよろしくお願いいたします。

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

NoMethodError in Comments#index Showing /Users/Desktop/debate-app/debate-app/app/views/comments/index.html.erb where line #37 raised: undefined method `image' for #<Comment::ActiveRecord_AssociationRelation:0x00007f8ce24cec00>
<% end %> <% end %> <% if @comments.image.attached? %> <-ここの部分のimageです <%= image_tag @commented.image %> <% end %> <% if @comments.image.attached? %>

該当のソースコード

--commentモデル-- class Comment < ApplicationRecord belongs_to :debate belongs_to :user, optional: true belongs_to :coach, optional: true has_one_attached :image has_one_attached :video comment = Comment.last comment.video.attach( io: File.open("path/to/video"), filename: "video.txt", content_type: "text/plain" ) validates :content, presence: true, unless: :was_attached? validates :content, presence: true, unless: :is_attached? def was_attached? self.image.attached? end def is_attached? self.video.attached? end end
--commentsコントローラー-- class CommentsController < ApplicationController def index @commented = Comment.all @comment = Comment.new @debate = Debate.find(params[:debate_id]) if coach_signed_in? @comments = @debate.comments.includes(:coach) else user_signed_id? @comments = @debate.comments.includes(:user) end end def create @debate = Debate.find(params[:debate_id]) if coach_signed_in? @comment = @debate.comments.new(coach_comment_params) else user_signed_id? @comment = @debate.comments.new(user_comment_params) end if @comment.save redirect_to debate_comments_path(@debate) else @comments = @debate.comments.includes(:coach) @comments = @debate.comments.includes(:user) render :index end end private def coach_comment_params params.require(:comment).permit(:content, :image, :video).merge(coach_id: current_coach.id) end def user_comment_params params.require(:comment).permit(:content, :image, :video).merge(user_id: current_user.id) end end

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

文章が拙く、申し訳ございません。
もし何か不足している、知りたいコードがありましたら、コメントをお願いします。

よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

@comments = @debate.comments.includes(:coach)

ここの上にbinding.pry入れて、@comments = @debate.comments.includes(:coach)
で値を取得できるかどうかと、@comments.imageで値出るかどうか見たらいかがでしょうか?

comment一つに対してimageが紐付いているということなので、現状のこのやり方だとうまくいかない気がします。

@commentsでやるなら、

@comments.each do |comment| if comment.image.attached?

みたいな感じでeach do等で一つずつ出さないとうまくいかないように思います。

投稿2021/01/03 05:32

educ_gt

総合スコア282

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

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

jm_swim

2021/01/03 08:11

返信ありがとうございます。 画像の投稿をするとエラーが出て、下記のコントローラーのimageのエラーです。 @debate = Debate.find(params[:debate_id]) if coach_signed_in? @comment = @debate.comments.new(coach_comment_params) <-ここで出ます else user_signed_id? @comment = @debate.comments.new(user_comment_params) end ですので、指摘いただいた方法のbinding.pryでのエラー原因が探れない状況です。 active storageを使わずに、comentテーブルにimageカラムを作成して保存することで解決することは可能になるのでしょうか?
educ_gt

2021/01/03 08:17

@comment = @debate.comments.new(coach_comment_params) ↑これの上にbinding.pryを置いたら使えませんか?
educ_gt

2021/01/03 08:21

active storageを使わずに、comentテーブルにimageカラムを作成して保存することで解決することは可能になるのでしょうか? 可能は可能ですが、個人的にactive_storageで出来るのであれば、carrierwaveより楽かなと思います。特にcarrierwaveは複数枚と関連付ける時に取り扱いが面倒になるイメージです。
jm_swim

2021/01/03 08:51 編集

要領が悪くすみません。 binding.pry @comment = @debate.comments.new(coach_comment_params) としたparamsの中身が、下記になります。 <ActionController::Parameters {"authenticity_token"=>"T84Wlq7HUYSH5I2QmlcZQndR8VCuktLLUEf2RRw6GLP2saU5mi+AofnVApwTgzHN5TkR2oc7iazFeMB4JjTaoQ==", "comment"=>{"content"=>"", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007f918b39b740 @tempfile=#<Tempfile:/var/folders/55/tbc64dxd78lbrbd053h319lh0000gn/T/RackMultipart20210103-50698-16q1jti.PNG>, @original_filename="IMG_0092.PNG", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"comment[image]\"; filename=\"IMG_0092.PNG\"\r\nContent-Type: image/png\r\n">}, "commit"=>"送信", "controller"=>"comments", "action"=>"create", "debate_id"=>"46"} permitted: false> 一度変数に入れ、.imageをしましたが、NoMethodErrorでした。
jm_swim

2021/01/03 08:53

動画の投稿も今後実装していきたいのですが、active storageで事足りるのでしょうか?
educ_gt

2021/01/03 08:58

params段階では問題なさそうですね。 coach_comment_paramsと打ったときに、imageは入ってますか? それでも入っているようであれば、 一度rails sをやりなおすのと、一度DBをリセットして作り直したらいかがでしょうか。 たまにつくりなおしたらうまくいくことあります。
educ_gt

2021/01/03 09:04

>動画の投稿も今後実装していきたいのですが、active storageで事足りるのでしょうか? 規模によりますが少なくとも個人アプリのレベルだと問題ないはずです。 https://www.youtube.com/watch?v=uV1hWKtza0g
jm_swim

2021/01/03 11:14

rails db:migrate:resetをしてからcoach_comment_paramsとした結果が下記になります。 <ActionController::Parameters {"content"=>"君", "image"=>#<ActionDispatch::Http::UploadedFile:0x00007ff538e5d5f0 @tempfile=#<Tempfile:/var/folders/55/tbc64dxd78lbrbd053h319lh0000gn/T/RackMultipart20210103-51193-1vzz7ay.PNG>, @original_filename="IMG_0092.PNG", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"comment[image]\"; filename=\"IMG_0092.PNG\"\r\nContent-Type: image/png\r\n">, "coach_id"=>3} permitted: true> 先ほどまでと同じエラーが続いています。エラー文は下記になります。 unknown attribute 'image' for Comment. if coach_signed_in? binding.pry @comment = @debate.comments.new(coach_comment_params) else user_signed_id? @comment = @debate.comments.new(user_comment_params) end
jm_swim

2021/01/03 11:15

参考動画まで頂いて、ありがとうございます!
educ_gt

2021/01/03 12:14

has_one_attached :video, optional: true これでhas_one_attachedを上書きしている可能性があるので、一度コメントアウトした上で、 , optional: trueも消していただくといかがでしょうか?
jm_swim

2021/01/03 12:46 編集

試してみたところ、has_one_attachedの上書きが原因みたいでした。 ありがとうございます! 送っていただいたYouTubeの動画、また関連動画を拝見しましたが、動画内ではhas_one_attachedを同じモデルに二つ書いていました。今回のエラーの件と何が違っていたのでしょうか? また、動画もhas_one_attachedで記述しようとしていましたが、他に方法があるのでしょうか? 何度も返答をいただいて、とても感謝しております。
educ_gt

2021/01/03 13:14

has_one_attached 2つでもいけそうですね。。 optional: trueを両方消したらいけたりしませんかね? optional: trueは通常belongs_toのオプションとして使用し、関連先に値が無くても保存できるようにするものの認識です。 これだめなら、carrierwaveとaccepts_nested_attritebutes_forを使って、videos tableを子テーブルとしてそこに保存するというやり方があります(複数テーブルの同時保存)。 ただ、active_storageでいけそうなので、その辺りをいじればなんとかなりそうな気がします。 https://blog.saeloun.com/2020/02/03/rails-allows-configure-service-for-attachments-to-activestorage.html
jm_swim

2021/01/03 13:38

has_one_attachedでimage, videoを記述して、image, videoどちらも投稿できなかったですが、送っていただいたurlの記事を参考にコードを変更したらどちらも投稿できました! ただvideoはビューでの表示ができない状態です。。 <% if comment.video.attached? %> <%= image_tag comment.video %><br> <% end %> imageと同じこの表示の仕方で、動画のサムネ、再生まではできないのでしょうか?
jm_swim

2021/01/03 15:40

video_tagに変えましたが、ビューの表示に変更はないです。。
educ_gt

2021/01/03 15:54

拡張子が.mov(iphoneのやつ)はだめだった気がします。 mp4とかの拡張子の動画だと多分いけるはずです!
jm_swim

2021/01/03 16:00

video_tagにすることで2つのエラーが出ていて、 Sprockets::Rails::Helper::AssetNotFound in Comments#index Showing /Users/Desktop/debate-app/debate-app/app/views/comments/index.html.erb where line #42 raised: The asset "" is not present in the asset pipeline. というものと、 Errno::ENOENT in CommentsController#index No such file or directory @ rb_sysopen - path/to/video comment = Comment.last comment.video.attach( io: File.open("path/to/video"), <-ここの部分です filename: "video.txt", content_type: "text/plain" ) というものです。 一つ目は、再読み込みするとエラーが解消され、二つ目は恐らく記述の問題ですが理想型がよくわからないです。。
jm_swim

2021/01/03 16:01

投稿はmp4の動画を使用していました!
educ_gt

2021/01/03 16:25

mp4でしたら問題なさそうですね! mount_uploader :video, VideoUploader これ、carrierwaveの記述なので、消した方がよいかもですね! comment.video.attach( io: File.open("path/to/video"), <-ここの部分です filename: "video.txt", content_type: "text/plain" ) ここどこかにコードとして書いてますか?
jm_swim

2021/01/04 01:01

mount_uploaderの記述は消しました! どこに書けばいいかわからなかったので、commentのモデルの部分に記述しました。
jm_swim

2021/01/04 03:26

<video src="<%= rails_blob_path(@video.video) %>" type="video/mp4" controls></video> 上記にならってビューファイルに記述したところ表示、動画の再生どちらも行えました! 昨日から何度も返信していただき、本当にありがとうございました! 私も早く技術的にレベルアップして、educ_gt様のように人に教えられる立場になりたいと心から思いました。 あらためましてありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問