Ruby on Railsを使ったアプリを作成中です。
コントローラーの「def update ~ end」内で「Model.update」を使って更新処理を行う前にフォームの値を取得し、既存データと比較したいのですが、
下記のソースでparams[:key]を使って取得しようとしても取得できていません。
【edit.html.erb】
<%= form_with model: @order, local: true do |f| %> <div class="form-group form-inline"> <%= f.label :amount, "金額:" %> ←取得したい値のkey <%= f.number_field :amount, class: "form-control" %> </div> ・ ・ ・ <div> <%= f.submit "更新", data: { confirm: "本当に更新しますか?" } , class: "btn btn-primary mb-3" %> </div> <% end %>
【orders_controller.rb】
class OrdersController < ApplicationController def update before_amount = @order.amount #↓入力された値を取得したい input_amount = params[:amount] puts "input_amount : #{params[:amount]}" # この結果は "input_amount: " #既存データと入力されたデータを比較して処理を分岐させたい if before_amount != input_amount #入力金額と既存データの金額が異なれば既存データの値は「変更前金額」カラムに入れる @order.before_amount = before_amount else end @order.update!(order_params) redirect_to order_path, notice: "オーダーID:#{@order.id}の情報を更新しました" end ・ ・ private def order_params params.require(:order).permit( :amount, :payment_status, :delivery_status, ) end end
上記の形で実装し更新処理を動かすと、入力フォームの金額入力欄には既存データの値が入っていますが、params[:amount]で値が取得できておらずinput_amout
が空となっています。
update時のorder_paramsでは金額の値が取得できており、入力済みの既存データの金額の値で更新処理が走っています。
結果的に期待通りに処理が動かず、金額変更を行なっていない場合でも変更前金額カラムにデータが入ってしまいます。
【更新時のログ】
Started PATCH "/orders/98" for 127.0.0.1 at 2020-09-11 19:33:37 +0900 Processing by OrdersController#update as HTML Parameters: {"authenticity_token"=>"", "order"=>{"amount"=>"5500", "payment_status"=>"done", "delivery_status"=>"racket_returned", "return_due_date"=>"2020-09-12", "return_date"=>"2020-09-12", "prepay_slip_number"=>"1111-1111-1111", "cod_slip_number"=>"4669-7509-6486"}, "commit"=>"更新", "id"=>"98"} User Load (1.2ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 ORDER BY `users`.`id` ASC LIMIT 1 Order Load (0.3ms) SELECT `orders`.* FROM `orders` WHERE `orders`.`order_completed` = TRUE AND `orders`.`id` = 98 LIMIT 1 ↳ app/controllers/orders_controller.rb:60:in `set_order' input_amount : (0.1ms) BEGIN ↳ app/controllers/orders_controller.rb:28:in `update' Order Update (2.0ms) UPDATE `orders` SET `orders`.`before_amount` = 5500, `orders`.`updated_at` = '2020-09-11 10:33:37.416028' WHERE `orders`.`id` = 98 ↳ app/controllers/orders_controller.rb:28:in `update' (2.6ms) COMMIT ↳ app/controllers/orders_controller.rb:28:in `update' Redirected to http://127.0.0.1:3002/orders/98 Completed 302 Found in 18ms (ActiveRecord: 6.3ms | Allocations: 5849)
input_amountにうまくフォームの値を渡して期待通りの処理を動かすための対処方法をご教示いただけますと助かります。
よろしくお願いいたいします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/09/11 11:11 編集
2020/09/11 14:01
2020/09/11 16:00