前提・実現したいこと
初心者です。
railsでレシピ投稿アプリを自己開発中でcarrier waveを用いて画像をアップロードしようとしていますができなくて困っているのでどなたか知恵をお借りしたいです。
発生している問題・エラーメッセージ
Dish
(料理)は親モデルのあたり、子モデルProcedure
(作業手順)をhas_many
の関係性となります。
dish_id
を元にしたProcedure
のnew画面のフォームにてorder(作業順序),introduction(作業の具体的な工程),image(作業の画像)をparamsで送りcreate
で保存したいです。
その際にf.file_field
に画像(image
)を指定してSubmitを行うと
との画面になります。
該当のソースコード
Ruby
1# model/dish.rb 2class Dish < ApplicationRecord 3 validates :title, presence: true, uniqueness: true 4 has_many :ingredients, through: :ingredients_in_dishes 5 has_many :ingredients_in_dishes #dependent: :destroy 6 has_many :procedures, dependent: :destroy 7end
Ruby
1# model/procedure.rb 2class Procedure < ApplicationRecord 3 belongs_to :dish 4 5 mount_uploader :image, ImageUploader 6end
Ruby
1# app/uploaders/image_uploader.rb 2class ImageUploader < CarrierWave::Uploader::Base 3 # Include RMagick or MiniMagick support: 4 # include CarrierWave::RMagick 5 # include CarrierWave::MiniMagick 6 7 # Choose what kind of storage to use for this uploader: 8 storage :file 9 # storage :fog 10 11 # Override the directory where uploaded files will be stored. 12 # This is a sensible default for uploaders that are meant to be mounted: 13 def store_dir 14 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 15 end 16 17 # Provide a default URL as a default if there hasn't been a file uploaded: 18 # def default_url(*args) 19 # # For Rails 3.1+ asset pipeline compatibility: 20 # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) 21 # 22 # "/images/fallback/" + [version_name, "default.png"].compact.join('_') 23 # end 24 25 # Process files as they are uploaded: 26 # process scale: [200, 300] 27 # 28 # def scale(width, height) 29 # # do something 30 # end 31 32 # Create different versions of your uploaded files: 33 # version :thumb do 34 # process resize_to_fit: [50, 50] 35 # end 36 37 version :medium do 38 process resize_to_fill: [1080, 1080] 39 end 40 41 # Add an allowlist of extensions which are allowed to be uploaded. 42 # For images you might use something like this: 43 def extension_allowlist 44 %w(jpg jpeg gif png) 45 end 46 47 # Override the filename of the uploaded files: 48 # Avoid using model.id or version_name here, see uploader/store.rb for details. 49 # def filename 50 # "something.jpg" if original_filename 51 # end 52end 53
Ruby
1# controllers/procedures_controller.rb 2class ProceduresController < ApplicationController 3 require 'byebug' 4 5 def create 6 dish = Dish.find_by(id: params[:dish_id]) 7 @procedure = dish.procedures.build(procedure_params) 8 byebug 9 if @procedure.present? 10 @procedure.save 11 redirect_to dishes_path 12 flash[:notice] = "#{dish.title}に手順#{@procedure.order}を登録しました" 13 else 14 redirect_to new_dish_procedure_path 15 flash[:alert] = "登録に失敗しました" 16 end 17 end 18 19 private 20 def procedure_params 21 params.permit( 22 :dish_id, :introduction, :order, :image 23 ) 24 end 25 26 def set_procedure 27 @procedure = Procedure.find_by(id: params[:id]) 28 end 29 30end 31
ruby
1# views/procedures/new.html.erb 2<div class="main"> 3 <div class="card mt-2 w-75 mx-auto"> 4 <div class="form-group text-center mt-4"> 5 <h2 class="text-secondary"></h2> 6 </div> 7 <div class="form-wrap m-2"> 8 <%= form_with model: @procedure, url: dish_procedures_path, local: true do |f| %> 9 <div class="form-group text-center w-75 mx-auto mt-2"> 10 <%= label_tag(:order, "STEP", class:"mr-2") %> 11 <%= f.number_field :order, step: "1", required: true %> 12 </div> 13 <div class="form-group text-center w-75 mx-auto mt-2"> 14 <%= f.text_area :introduction, required: true, placeholder: "作業工程" %> 15 </div> 16 <div class="form-group text-center w-75 mx-auto mt-2"> 17 <%= f.file_field :image %> 18 </div> 19 <div class="actions mt-4"> 20 <%= f.submit "登録", class: "btn btn-primary d-block ms-auto" %> 21 </div> 22 <% end %> 23 </div> 24 </div> 25</div>
ruby
1#schema.rb 2create_table "procedures", force: :cascade do |t| 3 t.string "image" 4 t.integer "dish_id", null: false 5 t.integer "order", null: false 6 t.text "introduction", null: false 7 t.datetime "created_at", precision: 6, null: false 8 t.datetime "updated_at", precision: 6, null: false 9 t.index ["dish_id"], name: "index_procedures_on_dish_id" 10 end
試したこと
carrier waveのドキュメント参照
gemの入れ直し
file_fieldの書き直し
byebugでのデバッグ
補足情報(FW/ツールのバージョンなど)
gem list *** LOCAL GEMS *** ~~~~~~~~~~~~~~~~~~~ carrierwave (2.2.2) mini_magick (4.11.0)
Big Sur ver.11.4
Rails 6.1.3.2
ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-darwin19]
Homebrew 3.1.12
ここからは検証していて個人的に気になった部分です。
-
Createアクション内に
byebug
を仕込んでもそれが呼ばれる前にこの画面が出ているのでそもそもcreate
アクションがよばれてない。 -
file_fieldでimageを設定しないで
submit
を押すとcreate
アクションがきちんとよばれimage以外のデータの保存は問題なくできますが、Params(下記)にimageのハッシュが存在していませんでした。
(別モデルのCreateアクションの場合、null
を許容してるカラムのフォームに値を入れないで送信した場合でも ”カラム名”=>nil
のハッシュはParamsに含まれていた。)
(byebug) params #<ActionController::Parameters {"authenticity_token"=>"-IJxFpJVZRu6DjuELL3tKHQJmfgnK7zRcSya1iszS3LcL2_JP7X4WIM8FLlXuner1gZnSZRtnLcEZScLFf7cYw", "order"=>"1", "introduction"=>"野菜の皮を剥く。", "commit"=>"登録", "controller"=>"procedures", "action"=>"create", "dish_id"=>"3"} permitted: false> (byebug) continue
上記の部分からView上での書き方の問題でしょうか。
特に具体的なエラーも吐かず、調べても同様の記事が見つからなかったので正直手詰まりな状態です。どのような助けでも泣いて喜びます。何か必要な情報に不足があればお申し付けください。
あなたの回答
tips
プレビュー