前提・実現したいこと
rubyで投稿のオリジナルアプリを作っています
目指すゴール:投稿内容編集後、更新ボタンで内容がupdateされること
現状:ActiveStorageでimageを1つ保存
中間テーブルでtag付けしている
usersテーブル
postsテーブル
tagsテーブル
post_tag_relationsテーブル(中間テーブル)
postsテーブル
Column | Type | Options |
---|---|---|
user | references | null: false, foreign_key: true |
title | string | null: false |
article_text | text | null: false |
status_id | integer | null: false |
category_id | integer | null: false |
Association
- belongs_to :user
- has_many :tags
- has_many :post_tags
発生している問題・エラーメッセージ
投稿内容の編集後、updateメゾッドへ渡りますが値が足りず、
返り値がfalseの際指定したeditアクションを実行する。(updateの失敗)
エラーメッセージは出ていませんが、if @form.valid?でfalseの状態です。
コンソール画面 https://gyazo.com/fe48cdb21e594c28fe3d9afa5e7d197f VSコード画面 https://gyazo.com/43cfd666da9b54d66c87df0b11f605ca
該当のソースコード
posts/controller.rb
ruby
1class PostsController < ApplicationController 2 before_action :set_post, only: [:show, :edit, :update] 3 4 //省略 5 6 def edit 7 @form = PostsTag.new(title: @post.title, article_text: @post.article_text, status_id: @post.status_id, category_id: @post.category_id, user_id: current_user.id, post_id: @post.id,image: @post.image) 8 end 9 10 def update 11 binding.pry 12 @form = PostsTag.new(update_params) 13 if @form.valid? 14 @form.update 15 redirect_to root_path 16 else 17 render :edit 18 end 19 end 20 21 def tag_search 22 return nil if params[:keyword] == "" 23 tag = Tag.where(['name LIKE ?',"%#{params[:keyword]}%"] ) 24 render json:{ keyword: tag } 25 end 26 27 private 28 29 def post_params 30 params.require(:posts_tag).permit(:title, :article_text, :status_id, :category_id, :image, :name).merge(user_id: current_user.id) 31 end 32 33 def update_params 34 params.require(:posts_tag).permit(:title, :article_text, :status_id, :category_id, :image, :name).merge(user_id: current_user.id, post_id: params[:id]) 35 end 36 37 def set_post 38 @post = Post.find(params[:id]) 39 end 40end 41
posts_tag.rb
ruby
1class PostsTag 2 include ActiveModel::Model 3 attr_accessor :title, :article_text, :status_id, :category_id, :image, :name, :user_id, :post_id 4 5 with_options presence: true do 6 validates :title , length: {maximum: 20} 7 validates :article_text , length: {maximum: 300} 8 validates :status_id , numericality: {other_than: 1, message: "は--以外から選んでください"} 9 validates :category_id , numericality: {other_than: 1, message: "は--以外から選んでください"} 10 validates :name 11 validates :image 12 end 13 14 def save 15 post = Post.create(title: title, article_text: article_text, status_id: status_id, category_id: category_id, image: image, user_id: user_id) 16 tag = Tag.where(name: name).first_or_initialize 17 tag.save 18 19 PostTagRelation.create(post_id: post.id, tag_id: tag.id) 20 end 21 22 def update 23 binding.pry 24 @post = Post.where(id: post_id) 25 post = @post.update(title: title, article_text: article_text, status_id: status_id, category_id: category_id, image: image, user_id: user_id) 26 tag = Tag.where(name: name).first_or_initialize 27 tag.save 28 29 map = PostTagRelation.where(post_id: post_id) 30 map.update(post_id: post_id, tag_id: tag.id) 31 end 32end
post/edit.html.erb
ruby
1<div class="inner"> 2 <div class="form__wrapper"> 3 <h2 class="page-heading">投稿内容編集</h2> 4 <%= form_with model: @form, url: post_path, method: :put, local: true do |f| %> 5 <%= render 'shared/error_messages', model: f.object %> 6 7 <div class="field"> 8 <%= f.label :status_id, "公開/非公開 必須" %><br /> 9 <%= f.collection_select(:status_id, Status.all, :id, :name, {class:"genre-select"}) %> 10 </div> 11 12 <div class="field"> 13 <%= f.label :category_id, "カテゴリー 必須" %><br /> 14 <%= f.collection_select(:category_id, Category.all, :id, :name, {class:"genre-select"}) %> 15 </div> 16 17 <div class="tag-field", id='tag-field'> 18 <%= f.label :name, "タグ" %> 19 <%= f.text_field :name, class:"input-tag" %> 20 </div> 21 <div id="search-result"> 22 </div> 23 24 <div class="field"> 25 <%= f.label :title, "記事タイトル" %><br /> 26 <%= f.text_field :title, id:"article_title" %> 27 </div> 28 29 <div class="field"> 30 <%= f.label :image, "投稿画像" %><br /> 31 <%= f.file_field :image, id:"post_image" %> 32 </div> 33 34 <div class="field"> 35 <%= f.label :article_text, "記事テキスト" %><br /> 36 <%= f.text_area :article_text, class: :form__text, id:"prototype_catch_copy" %> 37 </div> 38 39 <div class="actions"> 40 <%= f.submit "更新する", class: :form__btn %> 41 </div> 42 <% end %> 43 </div> 44</div>
試したこと
コンソールで確認(updateメゾットでデバックを行った。)
値はupdateに渡っていた
1| update_params => パラメーターはtrue
bash
1[1] pry(#<PostsController>)> update_params 2 User Load (0.6ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 3 ↳ app/controllers/posts_controller.rb:57:in `update_params' 4=> <ActionController::Parameters {"title"=>"test11111", "article_text"=>"testtest", "status_id"=>"2", "category_id"=>"3", "name"=>"NEWカップ", "user_id"=>1, "post_id"=>"18"} permitted: true>
2| params => 中身を確認するとimageが含まれていない?
bash
1[3]pry(#<PostsController>)> params 2=> <ActionController::Parameters {"_method"=>"put", "authenticity_token"=>"9WyNTjyboYOHzWgD5A+/lrbfop/6Lb9IX2Ig0mNrtsiSUowcfwztj0C876r5sWMSWQIEXITW5cYb/CHWACR/FA==", "posts_tag"=><ActionController::Parameters {"status_id"=>"2", "category_id"=>"3", "name"=>"NEWカップ", "title"=>"test11111", "article_text"=>"testtest"} permitted: false>, "commit"=>"保存する", "controller"=>"posts", "action"=>"update", "id"=>"18"} permitted: false>
3| ここからimageの含め方が分からず行き詰まっております。
稚拙な説明で確認に足りないコードがありましたらをコメントいただけますと幸いです
ご指南のほどお願いいたします
補足情報(FW/ツールのバージョンなど)
ruby '2.6.5' gem 'devise' gem 'pry-rails' gem 'active_hash' gem 'gimei' gem 'omniauth-facebook' gem 'omniauth-google-oauth2' gem "omniauth-rails_csrf_protection" gem 'omniauth', '~>1.9.1' gem 'mini_magick' gem 'image_processing', '~> 1.2'
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。