解決したい事
画像投稿時に画像が空なら投稿できないようにしたい
【image.rb】
ruby
1class Image < ApplicationRecord 2 mount_uploader :src, ImageUploader 3 belongs_to :product 4 validates :src, presence: true 5end
【product.rb】
ruby
1class Product < ApplicationRecord 2 has_many :images, dependent: :destroy 3 validates :name, presence: true 4 accepts_nested_attributes_for :images, allow_destroy: true 5end
外部キーにproduct_idを指定
【マイグレーション】
ruby
1class CreateImages < ActiveRecord::Migration[5.2] 2 def change 3 create_table :images do |t| 4 t.string :src 5 t.references :product, foreign_key: true 6 t.timestamps 7 end 8 end 9end
【products_controller】
ruby
1class ProductsController < ApplicationController 2 3 def index 4 @products = Product.includes(:images).order('created_at DESC') 5 end 6 7 def new 8 @product = Product.new 9 @product.images.new 10 end 11 12 def create 13 @product = Product.new(product_params) 14 if @product.save! 15 redirect_to root_path 16 else 17 render :new 18 end 19 end 20 21 22 def destroy 23 @product.destroy 24 redirect_to root_path 25 end 26 27 private 28 29 def product_params 30 params[:product].permit(:name, images_attributes: [:src, :_destroy, :id]) 31 end 32 33end
【new.html.haml】
ruby
1.main 2 %section.main__block 3 = form_for @product do |f| 4 .post__drop__box__container 5 .prev-content 6 .label-content 7 %label{for: "product_images_attributes_0_src", class: "label-box"} 8 %pre.label-box__text-visible クリックしてファイルをアップロード 9 .hidden-content 10 = f.fields_for :images ,multiple: true do |i| 11 = i.file_field :src ,class:"hidden-field", id: "product_images_attributes_0_src" 12 = i.file_field :src ,class:"hidden-field", id: "product_images_attributes_1_src", name: "product[images_attributes][1][src]" 13 =f.text_field :name 14 15 16 17 = f.submit "出品する",class: "btn-default__btn-red"
#現状
nameカラムとsrcカラムにバリデーションを設定
nameが空だと投稿できないが、srcは空でも投稿出来てしまう
#自分で調べたこと
パラメータを確認したところ、srcが空の時はパラメータにそもそも存在していない
※画像投稿時は「images_attributes"=>{"0"=>{"src"...」と記載されている
※画像を貼らないと何も表示しない
nameが空の時は"name"=>""となっている
srcが空の時でもsrcがNULLとしてパラメータ上に存在していればバリデーションが働くかも?
と思いまいしたが方法がわからず・・・
よろしくお願いします
あなたの回答
tips
プレビュー