Rails 5、#<Devise on line devise_parameter_sanitizer.forの未定義メソッド `for '


95

Rails 5を使用しています

新しいフィールドusernameをモデルUserに追加しました。

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_permitted_parameters

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).push(:username)  
  end
end

登録中にエラーが表示されます:#の未定義メソッド「for」フォーク

痕跡:

NoMethodError(#の未定義メソッド「for」ですか?フォーク?):

app/controllers/users/registrations_controller.rb:7:in `configure_permitted_parameters'
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (5.0ms)
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.9ms)
  Rendering /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.2ms)
  Rendered /usr/local/rvm/gems/ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (118.1ms)

誰が助けることができますか?この問題をどのように解決しますか?


1
Rails 4.2でも発生します。
sekrett 2016

回答:


173

According to the documentation:

パラメーターサニタイザーAPIがデバイス4で変更されました

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end

何らかの理由でこれは機能しますが、レールを再起動すると再び機能しなくなります
K2xL

@ K2xLビンをクリアしますか?おっと、その10月。これをどのように修正しましたか?
snowYetis

停止+おそらく春の再開
phillyslick

1
ありがとう!コードを更新したくない場合は、それに応じてGemfileを調整するだけでgem 'devise', '~> 3'済みます。
Darragh Enright

34

あなただけ変更した場合.for.permit、それは同様に動作します。例えば:

devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :username) }

Rails 4.2.xとRails 5.0.xの両方で動作します



0

コントローラーのconfigure_permitted_pa​​rametersメソッドでaccount_updateを逃したと思います。デバイスパターンに従う必要があります。Deviseにはアカウント更新ページがあります。これはviews / devise / registrations / edit.html.erbにあり、コードはsign_upページでも機能しません。ここでは、sign_upページを指定しています。

ユーザーテーブルを更新するには、users / editで更新を送信するか、sign_upページでユーザー名を送信する場合、この工夫パターンに従ってデータベースのUserテーブルを更新する必要があります。ユーザーテーブルに新しい列を追加した場合でも、configure_permitted_pa​​rametersメソッドに追加する必要があります。あなたの場合はユーザー名ですが、account_updateもありませんでした。基本的に、Deviseパターンに従わずに、ユーザー名を更新するか、文字列をユーザー名フィールドに追加したいと言っています。ユーザーテーブルに追加するフィールドは、このDeviseパターンに従う必要があります。また、このユーザー名の更新を許可するページを指定することもできます。以下の例では、デバイスの更新ページを使用しています。したがって、先ほど述べたように、ユーザーテーブルにカスタムフィールド名を追加した場合でも、このパターンに従う必要があります。

class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    devise_parameter_sanitizer.permit(:account_update, keys: [:username])
  end
end

次に、user.rbで、ユーザーモデルのユーザー名を検証していることを確認します。

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :username, presence: true
end

-1
class ApplicationController < ActionController::Base

  before_action :configure_permitted_paramters, if: :devise_controller?

  protected
    def configure_permitted_paramters

        devise_parameter_sanitizer.permit(:sign_up, keys: [:fullname])

        devise_parameter_sanitizer.permit(:account_update, keys: [:fullname, 
        :phone_number, :description, :email, :password])

    end

end
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.