【问题标题】:Rails 5, Undefined method `for' for #<Devise on line devise_parameter_sanitizer.forRails 5,#<Devise on line devise_parameter_sanitizer.for 的未定义方法“for”
【发布时间】:2016-09-17 10:34:00
【问题描述】:

我正在使用 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 # 你的意思是?分叉

追踪:

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)

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

【问题讨论】:

  • 它也发生在 Rails 4.2 上。

标签: ruby-on-rails devise ruby-on-rails-5


【解决方案1】:

我认为您在控制器的 configure_permitted_pa​​rameters 方法中错过了 account_update,您需要遵循设计模式。设计有一个帐户更新页面。您可以在views/devise/registrations/edit.html.erb 中找到它,并且您的代码在sign_up 页面中也不起作用,您在此处指定了sign_up 页面

要更新您的用户表,您在用户/编辑中提交更新的那一刻,或者如果您在注册页面中提交用户名,您需要遵循此设计模式,以更新数据库用户表。即使您向 user 表添加了新列,您也必须将其添加到 configure_permitted_pa​​rameters 方法。在您的情况下,它是用户名,但您也错过了 account_update。您基本上是在说要更新用户名或将字符串添加到用户名字段而不遵循设计模式。您添加到 User 表的任何字段都应遵循此设计模式。您还可以指定允许哪个页面更新此用户名。在下面的示例中,我使用的是设计更新页面。所以就像我说的,即使您向用户表添加了自定义字段名称,您也需要遵循此模式。如果您有另一个页面需要添加用户名,您只需执行相同操作即可。

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 中您的 User 模型中已验证用户名。

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

  validates :username, presence: true
end

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 他没有忘记,他需要切换到新的语法。
        【解决方案5】:

        According to the documentation:

        Devise 4 的 Parameter Sanitaizer API 已更改

        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
        

        【讨论】:

        • 由于某种原因这可行,但是当我重新启动 Rails 时它再次停止工作
        • @K2xL 清除您的垃圾箱?哎呀,十月了。你是怎么解决这个问题的?
        • 停止 + 重启 spring,也许
        • 谢谢!对于那些不想更新他们的代码的人,你可以相应地调整你的 Gemfile - gem 'devise', '~&gt; 3' 为我排序。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多