5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-10

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に変えれば会員登録でも使える
こうしておけば全てのフォームを埋めなくても、変えたいものと今のパスワードを書けば
登録内容の編集もできる。

5
8
0

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
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?