本に書いてある通りやっても何故かバリデーションが通らない。
何度やっても「Password Missing password」と怒られるばかり。
物は試しとGoogleで似たような人がいないか検索してみるが それらしいものは見当たらない。
試しにModelを全コピするが一向に改善しないため、どうやらtypoではないようだ。
( 元々3.2系の本だから ちょいちょい仕様が変わってたりするんだよなあ…今回もその周りのにおいがプンプンする )
それでもって POST時にユーザから渡って来たログを出してみて、その値を確認してみた。
Parameters: {"utf8"=>"V", "authenticity_token"=>"c4yT/Bt6ypoDW5rl119tndpOZgLLAE4pv824XPZXRdM=", "user"=>{"name"=>"aef", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Create User"} Unpermitted parameters: password, password_confirmation ========================================== Unpermitted parameters: password, password_confirmation {"name"=>"aef"} =========================================
password と password_confirm が入っていない。それでもって、その上に何やらおかしなエラーが。
「Unpermitted parameters: password, password_confirmation」
というわけで「Unpermitted parameters」で検索をかけた所、原因が判明。
Rails4系から Strong Parameters というのが導入されたらしい。
どうやら ホワイトリストみたいな感じで、「このパラメータ以外は受け付けないよ」というのを generate scaffold する際にコントローラに自動で記載してくれるらしい。
そこでusers_controllerを見てみると…。
# Never trust parameters from the scary internet, only allow the white list through. def user_params params.require(:user).permit(:name, :password_digest) end
あったあった。フロント側で仮想的にパラメータを立てる際はここも変えないとダメだったみたい。
というわけで以下のように変更。
# Never trust parameters from the scary internet, only allow the white list through. def user_params params.require(:user).permit(:name, :password, :password_confirmation) end
今度は無事に通った。
Written by Nisei Kimura ( 木村 仁星 )