Rails
devise

rails gem deviseのバージョン変更に気づかず1h以上溶かしたので、そのことをまとめてみた(undefind method'for'for)

More than 1 year has passed since last update.

railsでwebappを作る時にログインのあれこれを作るのに

gem deviseを使うことがあると思います。

僕はgem deviseにめっちゃ助けてもらっていたのですが

突然現れた

「undefind method'for'for・・・・・・・・・・・・・・・・・」

????????????????

これは何?

なんかやってしまったのか?

自分の書いたコードを見直して

それっぽいものを調べること1h以上

全く見当たらない

ふと見たgemfile.lock

deviseのバージョンが違う??????

過去に作ったwebappのdeviseのバージョンを見ると(3.5.6)

エラーが出ている方のバージョンは(4.2.0)

「おっ??これは?」

必殺!google検索!!

rails devise 4.0

すると、

どうやら今までの記述だとエラーが出るらしい

今までの記述


controller/application_controller.rb

before_action :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) << :name
end

nameのカラムを追加するとこんなことを書いていたと思います。

これだとさっきのエラーが出るらしい

で、じゃあどう書いたらいいかって話なんですが

devise_parameter_sanitizer.permit(:sign_up){|u|

u.permit(:◯◯◯◯)}

こんな感じに変えなきゃいけないらしくて


controller/application_controller.rb

before_action :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up){|u|
u.permit(:name)}
end

じゃあこれでいけるや

と思ってやってみると

今度は

emailとpasswordが空じゃけぇ入力せんか!

と、おっしゃるわけですよ?

は?入れてっけど。。。。。(−_−#)

何度試しても同じ。。。。

そろそろ、ふざけてるとぶっ壊すぞ!!

💡

もしかして


controller/application_controller.rb

before_action :configure_permitted_parameters, if: :devise_controller?

def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up){|u|
u.permit(:email, :name, :password, :password_confirmation)}
end

emailもpasswordも書いてないといけないのか?

これで試してみると

正常に動くではないか!!!!!!!

正常に動いてくれたので一件落着です

一応、バージョンの情報を

rails 4.2.5.1

devise 4.2.0

====追記====

もっと短くかけることが分かったのでそれを追記して来たいなと。


controller/application_controller.rb

  devise_parameter_sanitizer.permit(:sign_up){|u|

u.permit(:email, :name, :password, :password_confirmation)}

()の中にフォームの全ての項目を書いていたわけなんですけど、

これって、deviseの登録内容を編集するとき、全てのフォームを埋めないと

編集を完了することができないんですよね。

クソ不便。

ってなわけで


controller/application_controller.rb


devise_parameter_sanitizer.permit(:account_update, keys: [:name])


こう書けばデフォルトに追加した項目だけ書けばいい。

:account_updateは:sign_upに変えれば会員登録でも使える

こうしておけば全てのフォームを埋めなくても、変えたいものと今のパスワードを書けば

登録内容の編集もできる。