🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby

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

Ruby on Rails

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

Q&A

解決済

1回答

1841閲覧

carrierwaveでバリデーション失敗後に画像を保持できない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/09/23 02:44

実現したいこと

画像選択した後にバリデーション失敗しても選択した画像を保持したい。

調べてみたのですが、参考にしたサイトと同様な内容で保持できるというものしか見つけれませんでした。
どうかご教示お願い致します。

確認したこと

参考
こちらのサイトを参考に画像アップロード時に{column_name}_cacheという名前でhidden_fieldをプラスしたのですが、画像が登録されていない。
ログを確認したところ、追加したhidden_fieldで下記のようになります。

↳ /usr/local/src/bundles/app_name/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Unpermitted parameter: :car_image_cache

登録直前の処理を確認したところ、下記のようになっており、paramsの値やcreate時に違いが出ております。

〇一度バリデーションエラーにした時 Parameters: {"utf8"=>"✓", "authenticity_token"=>"Y4f2QDTUSs90XW+h9LV6a6CclGmwixfWtsZv2u6kZcocb15qR5IHByOCbgTFiFndwrTRyarqWMbppvSPiCnXuQ==", "sub_car"=>{"name"=>"車名", "car_number"=>"", "car_image_cache"=>"1569205451-777171524075852-0004-9006/ダウンロード.jpg", "car_type"=>"軽自動車"}, "commit"=>"登録"} User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ /usr/local/src/bundles/app_name/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Unpermitted parameter: :car_image_cache (0.3ms) BEGIN ↳ app/controllers/admin/sub_cars_controller.rb:11 SubCar Create (3.4ms) INSERT INTO `sub_cars` (`name`, `car_number`, `created_at`, `updated_at`) VALUES ('車名', '', '2019-09-23 02:24:16', '2019-09-23 02:24:16') 〇バリデーションエラーにしていない時 Parameters: {"utf8"=>"✓", "authenticity_token"=>"83in7GbKyXBts0Fih5ho7AKAcmp/4865y5JQm4h5n+aMkA/GFYyEuDpsQMe2pUtaYKg3ymWCgamU8svO7vQtlQ==", "sub_car"=>{"name"=>"車名", "car_number"=>"", "car_image"=>#<ActionDispatch::Http::UploadedFile:0x00007f5f5afd01e0 @tempfile=#<Tempfile:/tmp/RackMultipart20190923-2171-5bgqyh.jpg>, @original_filename="ダウンロード.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"sub_car[car_image]\"; filename=\"\xE3\x83\x80\xE3\x82\xA6\xE3\x83\xB3\xE3\x83\xAD\xE3\x83\xBC\xE3\x83\x89.jpg\"\r\nContent-Type: image/jpeg\r\n">, "car_image_cache"=>"", "car_type"=>"軽自動車"}, "commit"=>"登録"} User Load (0.9ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 ↳ /usr/local/src/bundles/app_name/ruby/2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98 Unpermitted parameter: :car_image_cache (0.2ms) BEGIN ↳ app/controllers/admin/sub_cars_controller.rb:11 SubCar Create (0.4ms) INSERT INTO `sub_cars` (`name`, `car_number`, `car_image`, `created_at`, `updated_at`) VALUES ('車名', '', '20190923022843.jpg', '2019-09-23 02:28:43', '2019-09-23 02:28:43')

関連するコード一覧

view

<%= form_for(@sub_car, :html => {:class => "form-horizontal"} ) do |f| %> 略 <div class="form-group"> <%= f.label :car_image, {class: 'col-md-2 col-md-offset-1 control-label'} %> <div class="col-md-8 col-md-offset-1"> <%= f.file_field :car_image %> <%= image_tag @sub_car.car_image.thumb.url if @sub_car.car_image? %> <%= f.hidden_field :car_image_cache %> </div> </div> 略

model

class SubCar < ApplicationRecord validates :name, presence: true, length: { minimum: 2, maximum: 25 } validates :car_type, presence: { message: :choice } enum car_type: { "軽自動車":0, "普通車":1 } mount_uploader :car_image, ImageUploader end

controller

class SubCarsController < ApplicationController before_action :authenticate_admin_user! before_action :find_sub_car, only: [:edit, :update, :destroy] def new @sub_car = SubCar.new end def create @sub_car = SubCar.new(sub_car_params) if @sub_car.save flash[:notice] = "登録しました" redirect_to root_path else render 'new' end end private def sub_car_params params.require(:sub_car).permit(:name, :car_type, :car_image, :car_number) end end

環境

rails (5.2.3)
rmagick (4.0.0)
ruby (2.6.3)

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

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

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

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

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

siruku6

2019/09/23 03:52

どうしたいのかがいまいちわからないのですが、 Unpermitted parameter: :car_image_cache が出ていることが困りごとなのだとしたら、 def sub_car_params  params.require(:sub_car).permit(:name, :car_type, :car_image, :car_number) # ←ここに追加 end の部分に :car_image_cache を追加してみてはいかがでしょう 少なくとも、unpermitted にはならないはず 「バリデーション失敗したら登録できない」というのは当然の動作なので、どうしてもそれが嫌だということであれば、バリデーション自体を解除するしかないでしょう。 --- # バリデーションを解除するためには、以下の2行を消すことになるが。。。 # 果たしてそれでよいのか? validates :name, presence: true, length: { minimum: 2, maximum: 25 } validates :car_type, presence: { message: :choice }
退会済みユーザー

退会済みユーザー

2019/09/23 04:12

ご回答ありがとうございます。 該当箇所に :car_image_cacheを追加したことで、エラーが消え、期待していた通りに動きました。 質問の意図が分かりづらくなってしまい、申し訳ございません。 現在、バリデーションエラー(画像以外の部分)になった時に選択した画像の情報が消えているので、再度選択する必要があります。バリデーションエラーになった際でも画像は選択された状態にしておきたいというのが今回の質問で聞きたかった内容となります。
siruku6

2019/09/23 04:18

>バリデーションエラー(画像以外の部分)になった時に選択した画像の情報が消えているので、再度選択する必要があります。バリデーションエラーになった際でも画像は選択された状態にしておきたい なるほど、この説明でよくわかりました!
guest

回答1

0

ベストアンサー

siruku6様のご指摘の通り、def sub_car_params
params.require(:sub_car).permit(:name, :car_type, :car_image, :car_number) # ←ここに追加
end
の部分に :car_image_cache を追加したところ、バリデーションエラーになっても、画像を保持するようになり、再度画像を選択しなくてもよくなりました。

投稿2019/09/23 04:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

siruku6

2019/09/23 04:18

解決してよかったです! ユーザビリティ向上のために頑張っていたのですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問