Rails 5, #<Devise on line devise_parameter_sanitizer.for 未定义方法`for'

Rails 5, Undefined method `for' for #<Devise on line devise_parameter_sanitizer.for

我正在与 Rails 5

一起工作

我在模型用户中添加了新字段用户名。

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

注册时显示错误:undefined method `for' for # Did you mean?分叉

跟踪:

NoMethodError(未定义的方法 `for' 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)

谁能帮忙?如何解决这个问题?

According to the documentation:

The Parameter Sanitaizer API has changed for Devise 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

别忘了devise_parameter_sanitizer.permit(:account_update, keys: [:username])

如果您只是将 .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

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

我认为您在控制器的 configure_permitted_parameters 方法中遗漏了 account_update,您需要遵循设计模式。 Devise 有一个帐户更新页面。您可以在 views/devise/registrations/edit.html.erb 中找到它,并且您的代码也不会在 sign_up 页面中工作,这里您指定了 sign_up 页面

要更新您的用户 table,您在 users/edit 中提交更新的那一刻,或者如果您在 sign_up 页面中提交用户名,您需要遵循此设计模式,更新数据库用户 table。即使您向用户 table 添加了一个新列,您也必须将其添加到 configure_permitted_parameters 方法。在您的情况下,它是用户名,但您也错过了 account_update。你基本上是说你想更新用户名或将字符串添加到用户名字段而不遵循设计模式。您添加到用户 table 的任何字段都应遵循此设计模式。您还可以指定允许哪个页面更新此用户名。在下面的示例中,我使用的是设计更新页面。所以就像我说的,即使您向 Users table 添加了自定义字段名称,您也需要遵循此模式。如果您有另一个页面需要添加用户名,您也可以这样做。

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

要更新您的用户 table,您在 users/edit 中提交更新的那一刻,或者如果您在 sign_up 页面中提交用户名,您需要遵循此设计模式,更新数据库用户 table。即使您向用户 table 添加了一个新列,您也必须将其添加到 configure_permitted_parameters 方法。在您的情况下,它是用户名,但您也错过了 account_update。你基本上是说你想更新用户名或将字符串添加到用户名字段而不遵循设计模式。您添加到用户 table 的任何字段都应遵循此设计模式。您还可以指定允许哪个页面更新此用户名。在下面的示例中,我使用的是设计更新页面。所以就像我说的,即使你添加了