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

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

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

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

アップロード

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

943閲覧

CarrierWaveで画像が保存できない。

yuld

総合スコア2

Ruby on Rails 5

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

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

アップロード

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

0クリップ

投稿2021/01/28 19:12

編集2021/01/28 19:55

発生している問題・エラーメッセージ

現在CarrirWaveを用いて画像をアップロードする機能を作っているのですが、
どうしても画像がDBに格納されません。。
是非とも皆様の知恵をお借りできれば幸いです。

パラメーターには画像名が入っているのですが、@projectには格納されていない状態なためDBには保存されておりません。

terminal

1Started POST "/admin/project/complete" for ::1 at 2021-01-29 03:55:34 +0900 2Processing by ProjectsController#complete as HTML 3 Parameters: {"utf8"=>"✓", "authenticity_token"=>"PW/4od6USTkRYA/WejU0IdrzwYUOwnJa4D8B8X7Ucq0EouC3d3FtWIzw4cpRl+fMYnPcROrHs8zyEykNIwi7rg==", "project"=>{"page_title"=>"test", "page_description"=>"test", "category_id"=>"1", "image"=>"/uploads/tmp/1611860130-792812304018408-0001-1745/4F24F1AA-6D96-4ECA-93B2-517767B400CE.JPG", "contents"=>"<p>test</p>"}, "commit"=>"内容を確認する >"} 4 5From: /test-app/app/controllers/projects_controller.rb:24 ProjectsController#complete: 6 7 22: def complete 8 23: @project = Project.new(project_params) 9 => 24: binding.pry 10 25: if @project.save! 11 26: redirect_to :action => 'admin_index' 12 27: else 13 28: render :action => 'new' 14 29: end 15 30: end 16 17[1] pry(#<ProjectsController>)> @project 18=> #<Project:0x00007fdee0a3e640 19 id: nil, 20 page_title: "test", 21 page_description: "test", 22 category_id: 1, 23 image: nil, 24 contents: "<p>test</p>", 25 author_user_id: nil, 26 last_update_user_id: nil, 27 created_at: nil, 28 updated_at: nil>

なお、public/uploads/tmpへは保存されております。
イメージ説明

そのまま処理を進めると、やはりDBに格納する直前でバリデーションがかかります。

terminal

1Started POST "/admin/project/complete" for ::1 at 2021-01-29 04:52:18 +0900 2Processing by ProjectsController#complete as HTML 3 Parameters: {"utf8"=>"✓", "authenticity_token"=>"Bl4b0y0RxyelZ4+fe+rF81IuJxjgB0uw3NROpcyJEnM/kwPFhPTjRjj3YYNQSBYe6q462QQCiibO+GZZkVXbcA==", "project"=>{"page_title"=>"wet", "page_description"=>"wet", "category_id"=>"1", "image"=>"/uploads/tmp/1611863536-108188832449489-0007-9172/4F24F1AA-6D96-4ECA-93B2-517767B400CE.JPG", "contents"=>"<p>qwet</p>"}, "commit"=>"内容を確認する >"} 4 (0.1ms) BEGIN 5 ↳ app/controllers/projects_controller.rb:24 6 (0.1ms) ROLLBACK 7 ↳ app/controllers/projects_controller.rb:24 8Completed 422 Unprocessable Entity in 3ms (ActiveRecord: 0.2ms) 9 10ActiveRecord::RecordInvalid (バリデーションに失敗しました: Imageを入力してください): 11 12app/controllers/projects_controller.rb:24:in `complete' 13

該当のソースコード

view/project/new.html.haml

haml

1- provide(:page_title, 'PROJECT 新規作成') 2 3.adminCommonContainer 4 = simple_form_for @project, url: admin_project_confirm_path, html: {multipart: true} do |f| 5 .inputField 6 = f.input :page_title, label: "タイトル", error: false 7 .inputField 8 = f.input :page_description, label: "ディスクリプション", error: false 9 .inputField 10 = f.input :category_id, as: :select, collection: [ ['Workshop', 1], ['Conference', 2] ], label: "カテゴリー", error: false 11 .inputField 12 = f.file_field :image, label: "サムネ写真", error: false 13 = f.hidden_field :image_cache 14 .inputField 15 = f.text_area :contents, label: "コンテンツ", error: false, class: "project_contents" 16 .submitButton 17 = f.submit '内容を確認する >', class: 'link__box'

controller/project_controller.rb

Ruby

1class ProjectsController < ApplicationController 2 3 def admin_index 4 @projects = Project.all.order('created_at DESC') 5 render :layout => 'admin_application' 6 end 7 def new 8 @project = Project.new 9 render :layout => 'admin_application' 10 end 11 def confirm 12 @project = Project.new(project_params) 13 render :layout => 'admin_application' 14 end 15 def complete 16 @project = Project.new(project_params) 17 binding.pry 18 if @project.save! 19 redirect_to :action => 'admin_index' 20 else 21 render :action => 'new' 22 end 23 end 24 25 private 26 def project_params 27 params.require(:project).permit(:page_title, :page_description, :category_id, :image, :image_cache, :contents, :author_user_id, :last_update_user_id) 28 end 29end

model/project.rb

Ruby

1class Project < ApplicationRecord 2 mount_uploader :image, ImageUploader 3 4 validates :page_title, presence: true 5 validates :page_description, presence: true 6 validates :category_id, presence: true 7 validates :image, presence: true 8 validates :contents, presence: true 9end

uploaders/image_uploader.rb

Ruby

1class ImageUploader < CarrierWave::Uploader::Base 2 3 # コメントアウト部省略 4 5 storage :file 6 7 # コメントアウト部省略 8 9 def store_dir 10 "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 11 end 12 13 # コメントアウト部省略 14end 15

db/schema.rb

Ruby

1ActiveRecord::Schema.define(version: 2021_01_28_165336) do 2 create_table "projects", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| 3 t.string "page_title" 4 t.text "page_description" 5 t.integer "category_id" 6 t.string "image" 7 t.text "contents" 8 t.integer "author_user_id" 9 t.integer "last_update_user_id" 10 t.datetime "created_at", null: false 11 t.datetime "updated_at", null: false 12 end 13end 14

補足情報(FW/ツールのバージョンなど)

version

1ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin19] 2rails 5.2.4.4 3mysql Ver 14.14 Distrib 5.7.32, for osx10.15 (x86_64) using EditLine wrapper 4carrierwave (2.1.0)

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
new(作成) → confirm(確認) → complete(完了)と言った形で確認画面を挟んでいたのですが、その際、cacheの設定をしていなかったため、confirmからcompleteにいく際に画像がない状態になっていたようです。
viewとcontrollerを下記にように変更しました。

veiw

BEFORE: view/project/confirm.html.haml

Haml

1  #省略 2  .inputField 3 = f.input :image, as: :hidden, label: "サムネ画像", error: false 4 = @project.image 5  #省略

AFTER: view/project/confirm.html.haml

Haml

1  #省略 2  .inputField 3  = image_tag(@project.image.url)#ここを変更 4  = hidden_field_tag :"cache[image]", @project.image.cache_name #ここを変更 5  #省略

controller

BEFORE: controller/project_controller.rb

Ruby

1  #省略 2 def complete 3 @project = Project.new(project_params) 4 if @project.save! 5 redirect_to :action => 'admin_index' 6 else 7 render :action => 'new' 8 end 9 end 10  #省略

AFTER: controller/project_controller.rb

Ruby

1  #省略 2 def complete 3 @project = Project.new(project_params) 4 @project.image.retrieve_from_cache! params[:cache][:image] #これを追加 5 if @project.save! 6 redirect_to :action => 'admin_index' 7 else 8 render :action => 'new' 9 end 10 end 11  #省略

投稿2021/01/29 06:04

編集2021/01/29 06:09
yuld

総合スコア2

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問