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

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

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

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

Ruby on Rails 6

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

Model

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

Ruby on Rails

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

1221閲覧

Railsでフォームから渡される値を受け取れない

GenkiSugiyama

総合スコア86

Ruby

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

Ruby on Rails 6

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

Model

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

Ruby on Rails

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2020/09/11 10:40

編集2020/09/11 10:48

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にうまくフォームの値を渡して期待通りの処理を動かすための対処方法をご教示いただけますと助かります。

よろしくお願いいたいします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

order_params[:amount]でどうでしょうか?

投稿2020/09/11 10:56

no1knows

総合スコア3365

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

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

no1knows

2020/09/11 11:11 編集

デバッグのやり方を覚えるとエラー解決が早くなると思います。 https://www.youtube.com/watch?v=5fyrGslhUcY 該当部分でpramsと実行したときと、order_paramsを実行したときの違いを見ると、permitted:がfalseになっていたり、実際の値がとれていないといったことがわかりやすいと思います。
GenkiSugiyama

2020/09/11 14:01

いつもご回答ありがとうございます!いただいたコードで文字列として受け取れることが確認できたのでintegerに変換したらif文が期待通りの動きをするようになりました。 ストロングパラメータのrequireの意味やformから渡されるデータの構造を理解しておらず詰まってしまいましたが、いただいた回答のおかげで多少理解が深まったと感じました。 デバック方法の動画も教えていただきありがとうございます!勉強させていただきますm(_ _)m
no1knows

2020/09/11 16:00

解決して良かったです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問