强参数 - 设计3.0.0和Rails 4.“未允许的参数:名称”

时间:2013-11-12 07:01:09

标签: ruby-on-rails ruby devise

我目前正在使用Rails 4和Devise 3.0.0。我已尝试在注册表单中添加“名称”的自定义字段并编辑注册表单。每当我提交表单时,都会出现以下错误:

Unpermitted parameters: name

WARNING: Can't mass-assign protected attributes for User: email, password, password_confirmation.

我知道这与Rails 4处理参数的方式有关,但我不明白我现在该怎么办。我已经四处搜索并看到我应该在涉及“params”的用户模型中添加一些行。

我的用户模型目前如下所示:

class User < ActiveRecord::Base

  devise :database_authenticatable, :registerable, #:recoverable,
          :rememberable, :trackable, :validatable

  attr_accessible :name, :password, :password_confirmation, :remember_me, :email
end

根据How is attr_accessible used in Rails 4?,我应该将以下代码添加到“控制器”中。

class PeopleController < ApplicationController
  def create
    Person.create(person_params)
  end

  private

  def person_params
    params.require(:person).permit(:name, :age)
  end
end

什么控制器?这是文字代码吗?由于我正在处理User,我是否必须使用User.create(user_params)?而不是Person.create(person_params)?

4 个答案:

答案 0 :(得分:4)

Rails 4已从模型中将参数清理移至Controller。 Devise处理3个动作,sign_in,sign_up和account_update。对于sign_up,允许的参数为authentication key(默认为:email),passwordpassword_confirmation

如果您要将:name添加到User模型并将其用于sign_up,请在config.authentication_keys = [ :email ]中将config.authentication_keys = [ :name ]更改为/config/initializers/devise.rb,或者,如果您想要同时使用:email:name,请将其添加到ApplicationController

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

  protected

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

同时检查 - https://github.com/plataformatec/devise#strong-parameters

答案 1 :(得分:0)

您必须在已编写User.create(user_params)的控制器中添加此项。我假设UsersController。

class UsersController < ApplicationController
  def create
    User.create(user_params)
  end

  private

  def user_params
#assumption: user params are coming in params[:user]
    params.require(:user).permit(:name, :age, :and_other_params_you_want_to_allow)
  end
end

答案 2 :(得分:0)

我有类似的问题。所以,为了解决它,我创建了自定义注册控制器继承形式DeviseRegistration控制器。检查Devise文档并定义这样的控制器。

class RegistrationsController < Devise::RegistrationsController
  before_filter :update_sanitized_params, if: :devise_controller?


  def update_sanitized_params
   devise_parameter_sanitizer.for(:sign_up) {|u| u.permit(:name, :email, :)}
 end
end

确保在config / routes.rb

中为此控制器定义了此路由
  devise_for :users, :controllers => {:registrations => "registrations" } , :path => '', :path_names => {
    :sign_in => 'login', 
    :sign_out => 'logout'
  }

Check this documentation of devise for strong parameter.

答案 3 :(得分:0)

我有类似的问题,这是我的修复:

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit!}
  end
end