使用强参数自定义设计

时间:2013-08-17 09:35:52

标签: ruby-on-rails devise ruby-on-rails-4 strong-parameters

我正在使用Rails 4.0.0和Devise 3.0.2并尝试在Devise自述文件中this instruction之后配置具有强参数的Devise。

我在application_controller.rb

中编写了这样的代码
class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :nick
  end
end

然后我访问了http://localhost:3000/users/sign_up。我得到了NoMethodError in Devise::RegistrationsController#new,其中说:

  

未定义的方法<<' for {}:ActionController::Parameters

并指向我写devise_parameter_sanitizer.for(:sign_up) << :nick

的确切行

我做错了什么吗?谢谢你的帮助。

3 个答案:

答案 0 :(得分:5)

尝试:

    class ApplicationController < ActionController::Base
      ...
      before_filter :configure_permitted_parameters, if: :devise_controller?   
      ...
      def configure_permitted_parameters
         devise_parameter_sanitizer.for(:sign_up) { |u| 
            u.permit(:email, :password, :password_confirmation, :nick) 
         }
      end

对我有用! :d

答案 1 :(得分:4)

作为Jose Valim said,它是Devise 3.1.0.rc功能,这就是它不起作用的原因。您必须使用README中的其他语法。

答案 2 :(得分:4)

问题完全符合您的问题:#2574 : devise_parameter_sanitizer.for(:sign_up) << :something raises an error

事实上,将自定义字段添加到强参数中的方法就是Devise 3.1附带的新功能。

由于Rubygems.org中的当前版本为3.0.3,因此您暂时不能在rails项目中使用此方法。你必须覆盖这样的默认值:

devise_parameter_sanitizer.for(:sign_up) do |u|
    u.permit :email, :password, :password_confirmation, :first_name, :last_name
end


但如果您真的需要,可以编辑 Gemfile 并替换此行

gem 'devise', '3.0.3'

这一个:

gem 'devise', github: 'plataformatec/devise', branch: 'master'

然后您可以轻松添加自定义字段:

# Single field
devise_parameter_sanitizer.for(:account_update) << :first_name
# Multiple fields at a time
devise_parameter_sanitizer.for(:account_update) << [:first_name, :last_name]

会被警告,目前这是候选发布者3.1.0 RC1