我目前正在使用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)?
答案 0 :(得分:4)
Rails 4已从模型中将参数清理移至Controller。 Devise处理3个动作,sign_in,sign_up和account_update。对于sign_up,允许的参数为authentication key
(默认为:email
),password
和password_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'
}
答案 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