Edited at

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

More than 5 years have passed since last update.

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

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が空だというエラーの原因はわからず…。