LoginSignup
62
52

More than 5 years have passed since last update.

【Rails】パラメータからcreateするときにはまったところメモ

Last updated at Posted at 2014-08-14

例えば下のようなパラメータを受け取ったとします。

Parameters: 
{
  "utf8"=>"✓", 
  "user"=>{
    "name"=>"テスト 太郎",
    "age"=>"20",
    "country"=>"Japan"},
  "check"=>"true"
}

このパラメータの中からuserキーの中身をデータベースに入れたい場合、単純に考えて以下のように記述しました。

user_controller.rb
class UserController < ApplicationController
  def new
    省略
  end
  def create
    user = User.create(params[:user])
  end
end

なんとなく通りそうな気がしますが、実際はActiveModel::ForbiddenAttributesErrorというエラーが吐かれます。
このエラーはGoo●le先生などに聞くと簡単に教えてもらえるのですが、Rails4のコア機能であるStrong Parametersの仕様による「検証通ってないよー」というエラーだそうです。
詳しくはTECHSCORE BLOGのRails4 の Strong Parameters でリクエストパラメータを検証するなどを参照して下さい。
ということで、書き直したのがこちら。

user_controller.rb
class UserController < ApplicationController
  def new
    省略
  end
  def create
    user = params.require(:user).permit(:name, :age, :country)
    User.create(user)
  end
end

TECHSCORE BLOGによると、user = params.require(:user).permit(:name, :age, :country) の部分では「params が :user というキーを持ち、params[:user] は :name、:age、:country というキーを持つハッシュであること」を検証しているそうです。

大抵の記事ではこの方法で書いてあるので、これで通るだろうと思っていたのですが、まさかのエラー。
:name、:age、:country全てのキーに値が入っていたのに、:userは空だと言われてしまいました。
そんなまさか、と思ってもう一度実行するも同じエラー。
念のため全パラメータの値を確認するも、全部ちゃんと値が入っていました。
何故そのエラーが出たのかよくわからないまま悩んでいても仕方ないので別の方法をとり、以下のように修正しました。
別の方法とは言っても考え方は同じで「params が :user というキーを持ち、params[:user] は :name、:age、:country というキーを持つハッシュであること」

user_controller.rb
class UserController < ApplicationController
  def new
    省略
  end
  def create
    user = params[:user].permit(:name, :age, :country)
    User.create(user)
  end
end

これでやっと通りました。
後から試したところどちらの方法でもちゃんと通ることを確認しましたが、未だに値が入っているのに:userが空だというエラーの原因はわからず…。

62
52
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
62
52