1

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

Unpermitted parameters: name

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

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

我的用户模型目前看起来像这样:

class User < ActiveRecord::Base

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

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

根据如何在 Rails 4 中使用 attr_accessible?,我应该将以下代码添加到“控制器”中。

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

  private

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

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

4

5 回答 5

4

Rails 4 已将参数清理从模型移至控制器。Devise 处理 3 个操作,sign_in、sign_up 和 account_update。对于 sign_up,允许的参数是authentication key:email默认情况下)passwordpassword_confirmation.

如果您想添加:nameUser模型并将其用于 sign_up,请更改config.authentication_keys = [ :email ]config.authentication_keys = [ :name ]in/config/initializers/devise.rb或者,如果您想同时使用:emailand :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

于 2014-07-31T06:41:47.280 回答
0

是的,您应该添加一行,如下所示:-

attr_accessible :name

在您的模型中允许分配名称,如果它不起作用,请尝试这个在 Rails 4 中如何使用 attr_accessible?

于 2013-11-12T07:02:32.287 回答
0

您必须在您编写 User.create(user_params) 的控制器中添加它。我假设用户控制器。

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
于 2013-11-12T07:23:18.250 回答
0

我有类似的问题。所以,为了修复它,我创建了自定义注册控制器,继承了 DeviseRegistration 控制器。检查设计文档并像这样定义控制器。

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'
  }

检查此设计文档以获取强大的参数。

于 2014-03-19T05:34:39.680 回答
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
于 2014-03-19T07:57:38.813 回答