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

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

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

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

Q&A

解決済

2回答

2875閲覧

RailsでsaveをしようとするとActiveModel::MissingAttributeErrorというエラーがでてしまう

hidayoshi231

総合スコア6

Ruby on Rails 5

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

0グッド

0クリップ

投稿2020/02/02 08:21

編集2020/02/02 10:46

前提・実現したいこと

ActiveModel::MissingAttributeErrorというエラーを解決し、投稿をセーブできるようにしたい。

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

現在Twitter風のSNSアプリを勉強のため作成しています。

imageposts_controller.rb

1# frozen_string_literal: true 2 3class ImagepostsController < ApplicationController 4 before_action :logged_in_user, only: %i[create destroy] 5 before_action :correct_user, only: :destroy 6 before_action :admin_user, only: :destroy 7 # attr_accessor :avatar 8 9 def create 10 @imagepost = current_user.imageposts.build(imagepost_params) 11 if @imagepost.save 12 flash[:success] = 'Imagepost created!' 13 redirect_to root_url 14 else 15 @feed_items = [] 16 render 'static_pages/home' 17 end 18 end 19 20 def destroy 21 @imagepost.destroy 22 flash[:success] = 'imagepost deleted' 23 redirect_to request.referer || root_url 24 end 25 26 private 27 28 def imagepost_params 29 params.require(:imagepost).permit(:content, :picture) 30 end 31 32 def correct_user 33 @imagepost = current_user.imageposts.find_by(id: params[:id]) 34 redirect_to root_url if @imagepost.nil? 35 end 36end 37

このコードを実行し、フォームに文字を入力した状態で新しい投稿を作成しようとすると

ActiveModel::MissingAttributeError in ImagepostsController#create can't write unknown attribute `avatar` Extracted source (around line #11): 9 def create 10 @imagepost = current_user.imageposts.build(imagepost_params) 11 if @imagepost.save 12 flash[:success] = 'Imagepost created!' 13 redirect_to root_url 14 else Rails.root: /Users/Toshiki/Desktop/portfolio/instravel Application Trace | Framework Trace | Full Trace app/controllers/imageposts_controller.rb:11:in `create' Request Parameters: {"utf8"=>"✓", "authenticity_token"=>"DaWd/yEYD6uQGppfdGgW99PSyqcKgxDkWQOVlcW+ZX4CU/cs3g/N52uGuK0cm3rJDAj7DTnPs4Ipt5Q7ZiBoEQ==", "imagepost"=>{"content"=>"a"}, "commit"=>"Post"} Toggle session dump Toggle env dump Response Headers: None

というエラーが発生します。avatarはUserモデルに与えている属性で、ユーザーのプロフィール画像のstringを持ちます。Imagepostモデルは投稿するコンテンツ(text)と画像の名前(string)を属性に持ちます。

画像の管理はcarrierwaveとmini_magickを使用しています。

デバッグしたところ、if @imagepost.saveの部分に問題があることがわかり色々試したのですが、解決しません。

current_userはavatar属性を持っていますが、ここでsaveするのは@imagepostなのでavatarは関係ないはずです。それなのになぜimagepostにもavatarが必要みたいなエラーがでるのでしょうか?

よろしくおねがいします。

試したこと

attr_accessor :avatar

でImagepostコントローラーに属性を与えてみたがダメだった。

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

Rails5.1.6
carrierwave
mini_magick

###createを実行するview側のファイル

form_withで送信します。

_imagepost_form.html.erb

1<%= form_with model: @imagepost, local: true do |f| %> 2 <div class="card mb-3"> 3 <div class="card-header"> 4 <span class="font-weight-bold"> 5 HOME 6 </span> 7 </div> 8 <div class="card-body"> 9 <p class="card-text"> 10 <%= render 'shared/error_messages', object: f.object %> 11 <div class="form-group"> 12 <%= f.text_area :content, placeholder: "Compose new imagepost...", 13 class: "form-control w-100" %> 14 </div> 15 <div class="form-group"> 16 <%= f.file_field :picture, class: "form-control-file" %> 17 </div> 18 </p> 19 <%= f.submit "Post", class: "btn btn-primary" %> 20 </div> 21 </div> 22<% end %> 23<script type="text/javascript"> 24 $('#imagepost_picture').bind('change', function() { 25 var size_in_megabytes = this.files[0].size/1024/1024; 26 if (size_in_megabytes > 5) { 27 alert('Maximum file size is 5MB. Please choose a smaller file.'); 28 } 29 }); 30</script>

###2020/02/02追記

現在エラーがでているアプリはGithubで管理しています。 ここにコードを片っ端から貼るよりも、リンクを貼ったほうが早いと判断しました。

現在制作中のアプリのレポジトリ

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

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

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

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

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

guest

回答2

0

自己解決

imagepost.rbに

imagepost.rb

1mount_uploader :avatar, AvatarUploader

をしていたことが原因でした。お騒がせしました。

投稿2020/02/05 02:31

hidayoshi231

総合スコア6

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

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

0

なぜimagepostにもavatarが必要みたいなエラーがでるのか
avaterがどこにも無いのになぜ出てくるのか
不思議です。私の手に負えるかわかりませんが、以下を載せてください
1)エラーは全文を
2)createを呼び出すview

投稿2020/02/02 10:24

winterboum

総合スコア23284

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

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

hidayoshi231

2020/02/02 10:37

こんな情報の少ない質問に回答いただきありがとうございます。内容を追加しました。
hidayoshi231

2020/02/02 10:44

念のためソースコードを全てGithubにあげました。
winterboum

2020/02/02 11:02

あ、回答できるか不安だったのでコメントに書くつもりだったのに、回答に書いちゃってた。。。 追加いただいた情報を拝見したのですが私の目ではおかしな所見当たらず、でした。 回答 -1 しておいてください。 なお、今回の問題には関係ないですが、attr_accessor :avatar するならモデルの方へ、です。
hidayoshi231

2020/02/02 20:42

ご丁寧にありがとうございます。了解しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問