前提・実現したいこと
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で管理しています。 ここにコードを片っ端から貼るよりも、リンクを貼ったほうが早いと判断しました。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。