実現したいこと
画像選択した後にバリデーション失敗しても選択した画像を保持したい。
調べてみたのですが、参考にしたサイトと同様な内容で保持できるというものしか見つけれませんでした。
どうかご教示お願い致します。
確認したこと
参考
こちらのサイトを参考に画像アップロード時に{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)
どうしたいのかがいまいちわからないのですが、
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 }
ご回答ありがとうございます。
該当箇所に :car_image_cacheを追加したことで、エラーが消え、期待していた通りに動きました。
質問の意図が分かりづらくなってしまい、申し訳ございません。
現在、バリデーションエラー(画像以外の部分)になった時に選択した画像の情報が消えているので、再度選択する必要があります。バリデーションエラーになった際でも画像は選択された状態にしておきたいというのが今回の質問で聞きたかった内容となります。
>バリデーションエラー(画像以外の部分)になった時に選択した画像の情報が消えているので、再度選択する必要があります。バリデーションエラーになった際でも画像は選択された状態にしておきたい
なるほど、この説明でよくわかりました!
回答1件
あなたの回答
tips
プレビュー