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

我目前正在使用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”的User模型中添加一些行。

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

 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,我是否必须使用User.create(user_params)? 而不是Person.create(person_params)?

您必须在已编写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 

Rails 4已经从模型中将参数消毒转移到Controller。 Devise处理3个动作,sign_in,sign_up和account_update。 对于sign_up,允许的参数是authentication key (默认情况下为:email ), passwordpassword_confirmation

如果要将:name添加到User模型并将其用于sign_up,请在/config/initializers/devise.rb中将config.authentication_keys = [ :email ]更改为config.authentication_keys = [ :name ] ,或者,如果需要同时使用: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

是的,你应该添加一行,如: –

 attr_accessible :name 

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

我有类似的问题。 所以,为了解决它,我创建了自定义注册控制器inheritanceformsDeviseRegistration控制器。 检查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' } 

检查设备的文档以获取强参数。

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

 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