質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

1033閲覧

CarrierWaveでの画像のアップロードができない

yuton-933

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

アップロード

アップロードは特定のファイルをウェブサーバに送るプロセスのことを指します。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2021/06/19 03:22

編集2021/07/05 04:03

前提・実現したいこと

初心者です。
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上での書き方の問題でしょうか。
特に具体的なエラーも吐かず、調べても同様の記事が見つからなかったので正直手詰まりな状態です。どのような助けでも泣いて喜びます。何か必要な情報に不足があればお申し付けください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問