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

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

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

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

Ruby

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

Q&A

解決済

2回答

3105閲覧

Rails ユーザーモデルのupdateができない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2019/05/29 03:15

初歩的な質問かも知れませんがお知恵を拝借させてください。

Ruby on Rails を使って簡単なウェブアプリケーションを作成しています。
ユーザーの身体情報を編集する機能を実装しているのですが下の部分でupdateできず、undefined method 'each_key' for #<ActionController::Parameters:0x00007f9bda024c20>とエラーが出ます。
エラーでは@user.update_columns(user_params)の部分で処理が止まっています。

calcalos_controller

1 2class CalcalosController < ApplicationController 3 before_action :alert_account, raise: false 4 5 def edit 6 @user = current_user 7 end 8 9 def update 10 @user = current_user 11 @user.update_columns(user_params) 12 flash[:notice] = "身体データを登録しました。" 13 redirect_to userinfo_path 14 end 15 16 private 17 def user_params 18 params.require(:user).permit(:tall, :age, :gendar, :active_level, :recom_calorie) 19 end 20end 21

試したこと

binding.pryで該当部分を調べてみました。
paramsやuser_paramsには想定したとおりの値が入っており、なぜupdateできないのか分かりませんでした。

8: def update 9: @user = current_user => 10: binding.pry 11: @user.update_columns(user_params) 12: flash[:notice] = "身体データを登録しました。" 13: redirect_to userinfo_path 14: end [1] pry(#<CalcalosController>)> @user => #<User:0x00007f9bd74171c8 id: 5, username: "太郎", email: "example@gmail.com", password_digest: "$2a$10$MoCSdaIutpXU09PdIeHuv.5QN/uR8mes5jVoiQvWqWk71vW3izHpO", tall: nil, age: nil, gendar: nil, active_level: nil, recom_calorie: nil, admin: false, image: nil, ate_recrod_id: nil, created_at: Tue, 28 May 2019 17:25:46 JST +09:00, updated_at: Tue, 28 May 2019 22:56:46 JST +09:00, remember_digest: nil, activation_digest: "$2a$10$7XdHMPWdWmSSnBkv/IMi6uxCZifGHbRbrqeG1N/5hb1RE9GPCNaja", activation: true, activation_at: Tue, 28 May 2019 17:27:19 JST +09:00, reset_digest: "$2a$10$/FVSN4LDYx8D4kOP2mdWl.P69q4yB0NezP7FGxNOAtJlT8djm.gSK", reset_sent_at: Tue, 28 May 2019 22:54:43 JST +09:00> [2] pry(#<CalcalosController>)> user_params => <ActionController::Parameters {"tall"=>"164", "age"=>"25", "gendar"=>"man", "active_level"=>"2.0", "recom_calorie"=>"2840"} permitted: true> [3] pry(#<CalcalosController>)> @user.update_columns(user_params) NoMethodError: undefined method `each_key' for #<ActionController::Parameters:0x00007f9bd7d84ff8> Did you mean? each_pair from /Users/seiyatakada/Dropbox/calosee/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.2/lib/active_record/persistence.rb:470:in `update_columns' [4] pry(#<CalcalosController>)> params => <ActionController::Parameters {"utf8"=>"✓", "_method"=>"patch", "authenticity_token"=>"3gmSGO3n8tVNfwFbUd0JsvXj4fVzjJn3TYOV7nEb08lJHOEyAeDqrzNJ5voBMc6cF1/5sO/9UitzYvjn5LB96Q==", "user"=><ActionController::Parameters {"tall"=>"164", "age"=>"25", "gendar"=>"man", "active_level"=>"2.0", "recom_calorie"=>"2840"} permitted: false>, "commit"=>"このデータで登録する", "controller"=>"calcalos", "action"=>"update", "id"=>"5"} permitted: false>

補足情報

ruby: 2.5.3p105
rails: 5.2.2
devise: 4.6.2

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

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

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

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

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

guest

回答2

0

ベストアンサー

エラーを避けるだけなら odyu さんの対応で良いと思うのですが、そもそも update_columns を使っているのは意図通りでしょうか?
update_columns には以下のような特徴があり、過去値の訂正等では便利ですが

  • validateは適用されない
  • コールバックは呼ばれない
  • 時刻は updated_atなどに残らない

普段遣いは以下の挙動をする update を使うべきではないでしょうか?

  • validateが適用される
  • コールバックが呼ばれる
  • 時刻は updated_atなどに残る

update なら to_hash しなくても大丈夫です

投稿2019/05/31 01:31

Ighrs

総合スコア656

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

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

退会済みユーザー

退会済みユーザー

2019/05/31 03:21

ご回答ありがとうございます。 今回既にあるユーザーテーブルに付加して個人的な情報を入れようとしていたためupdate_columnsを使っておりました。 lghrsさんの指摘をお聞きしてテーブルを分けるべきだったと気づけました。ありがとうございます。
guest

0

ruby

1@user.update_columns(user_params.to_hash)

としたら動くのではないでしょうか?

userモデル内でeach_keyを使ってるのが問題なのかとは思いますが。

投稿2019/05/29 15:59

odyu

総合スコア548

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

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

退会済みユーザー

退会済みユーザー

2019/05/31 03:24

ご回答ありがとうございます。 ご指摘のとおりにしたところ無事updateされるようになりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問