オリジナルアプリ開発中の初学者です
確認に足りないソースがありましたらご連絡ください
どうぞよろしくお願いいたします
##目指すゴール
edit画面でimageを改めて選択しなくても、新規投稿の際洗濯した画像を保持したまま更新ができること
##問題点
今回
編集画面でimageのfileが受け取れていないため、
空禁止のバリデーションエラーメッセージが表示されます(Image can't be blank)
name属性にpost_tag[image]が生成されています
尚、新規投稿でimageを選択、保存をしています。
###やったこと
postとtagを同時に保存するためpost_tagモデルを作ったのが原因なのか?
SQLのJOINとONを用いてimageのfilenameを取得しvalue:変数として加えたが、ファイルを特に指定せず送信ボタンを押下すると同じく空禁止のバリデーションエラーメッセージが表示されます(Image can't be blank)
現在の画面
ruby
1class PostsController < ApplicationController 2 before_action :set_post, only: [:show, :edit, :update] 3 4 def edit 5 @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) 6 end 7 8 def update 9 @form = PostsTag.new(update_params) 10 if @form.valid? 11 @form.update 12 redirect_to root_path 13 else 14 render :edit 15 end 16 end 17 18 private 19 20 def update_params 21 params.require(:posts_tag).permit(:title, :article_text, :status_id, :category_id, :image, :name).merge(user_id: current_user.id, post_id: params[:id]) 22 end 23 24 def set_post 25 @post = Post.find(params[:id]) 26 end 27end
html/edit.html.erb
ruby
1<%= form_with model: post, url: post_path, method: :put, local: true do |f| %> 2 <%= render 'shared/error_messages', model: f.object %> 3 4 //省略 5 6 <div class="field"> 7 <%= f.label :image, "投稿画像" %><br /> 8 <%= f.file_field :image, id:"post_image" %> 9 </div> 10 11 <div class="actions"> 12 <%= f.submit "保存する", class: :form__btn %> 13 </div> 14<% end %>
model/PostsTag.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 @post = Post.where(id: post_id) 24 post = @post.update(title: title, article_text: article_text, status_id: status_id, category_id: category_id, image: image, user_id: user_id) 25 tag = Tag.where(name: name).first_or_initialize 26 tag.save 27 28 map = PostTagRelation.where(post_id: post_id) 29 map.update(post_id: post_id, tag_id: tag.id) 30 end 31end
あなたの回答
tips
プレビュー