设计:未允许的参数

时间:2016-02-27 10:15:27

标签: ruby-on-rails ruby devise

我不是为什么,但以下代码停止了工作(我甚至没有注意到它是如何发生的)

的routes.rb

devise_for :users, components: {registrations: 'registrations', sessions: 'sessions'}

registations_controller.rb

class RegistrationsController < Devise::RegistrationsController
  before_filter :configure_permitted_parameters

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).push(:name, :surname, :username, :email, :avatar)
    devise_parameter_sanitizer.for(:account_update).push(:name, :surname, :email, :avatar)
  end

end

正如我所说,以前每个人都工作得很好,但现在我得到了:

Processing by Devise::RegistrationsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"lvuPOmTRqv6XUQ/O1g4Q9VNvzD7DgGCHocY/OlAvKHEIvWAHvlS982hxSZZzzAESCpmL5QTUcTLw/c9ME/sUFQ==", "user"=>{"name"=>"John", "surname"=>"Doe", "username"=>"foobar", "email"=>"foobar@example.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Register"}
Unpermitted parameters: name, surname, email

Cofiguration:

  • Rails 4.2.5
  • 设计3.5.6

P.S。:现在我完全理解为什么要用单元测试覆盖我的代码并使用Travis CI

4 个答案:

答案 0 :(得分:13)

自4.1以来,for方法已被弃用。请改用:

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

  protected

  def configure_permitted_parameters
    attributes = [:name, :surname,:username, :email, :avatar]
    devise_parameter_sanitizer.permit(:sign_up, keys: attributes)
    devise_parameter_sanitizer.permit(:account_update, keys: attributes)
  end
end

答案 1 :(得分:10)

我认为您应该在应用程序控制器中尝试“configure_permitted_pa​​rameters”方法而不是注册控制器。

class ApplicationController < ActionController::Base

 before_action :configure_permitted_parameters, if: :devise_controller?

 protected

 def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).push(:name, :surname,:username, :email, :avatar)
    devise_parameter_sanitizer.for(:account_update).push(:name, :surname, :email, :avatar)
 end
end

答案 2 :(得分:0)

在4.5.0文档中:

  

如果您想允许其他参数(惰性方法™),您可以   可以使用ApplicationController中的简单before过滤器来做到这一点:

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 5.2.1)。

带有嵌套参数(未经测试):

  

嵌套属性(例如您使用的是accepts_nested_attributes_for),   那么您将需要告诉设计有关这些嵌套和类型的信息:

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, 
           address_attributes: [:country, :state, :city, :area, :postal_code]])
  end
end

答案 3 :(得分:0)

在使用Devise gem时,我也遇到了这个问题。这是由于我在Rails应用程序中向email_confirmation模型中添加了users参数而没有在users_controller中将该参数列入白名单。

这是我的解决方法:

  1. 只需打开users_controller
  2. email_confirmation参数添加到users_params操作中允许的参数列表中。
  3. 保存,然后重新加载浏览器。

仅此而已。

我希望这会有所帮助