添加自定义字段/列来deviseRails 4
我试图添加一个full_name
字段/列到我的用户模型(使用devise
gem)和Rails 4。
大多数的在线示例都推荐使用attr_accessible ,但是听起来Rails 4中应该采用不同的方式。
我如何将full_name
添加到我的用户模型? 我已经能够成功运行迁移。
文件:迁移> add_full_name_to_users
class AddFullNameToUsers < ActiveRecord::Migration def change add_column :users, :full_name, :string end end
文件:注册> app / views / devise / registration / new.html
. . . <%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> <%= devise_error_messages! %> <%= f.label :full_name %> <%= f.text_field :full_name, :autofocus => true %> <%= f.label :email %> <%= f.email_field :email %> . . .
一旦您的模型具有其full_name属性,您将必须为#sign_up和#account_updatedevise操作configuration允许的参数。
class ApplicationController < ActionController::Base before_action :configure_devise_permitted_parameters, if: :devise_controller? protected def configure_devise_permitted_parameters registration_params = [:full_name, :email, :password, :password_confirmation] if params[:action] == 'update' devise_parameter_sanitizer.for(:account_update) do |u| u.permit(registration_params << :current_password) end elsif params[:action] == 'create' devise_parameter_sanitizer.for(:sign_up) do |u| u.permit(registration_params) end end end end
这个解决scheme应该工作,使用sign_up和更新 :
class ApplicationController < ActionController::Base before_filter :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:full_name]) devise_parameter_sanitizer.permit(:account_update, keys: [:full_name]) end end
从devise文档:
当您自定义您自己的视图时,您最终可能会向表单添加新的属性。 Rails 4将参数清理从模型移动到控制器,导致Devise在控制器中处理这个问题。
你应该检查下面的urlfind最适合你的需求的方法: https : //github.com/plataformatec/devise#strong-parameters
为devise启用强参数而不是attr_accessible。 要做到这一点,创build一个新的initiliazer与内容:
DeviseController.class_eval do def resource_params unless params[resource_name].blank? params.require(resource_name).permit(:email, :password, :password_confirmation, :remember_me) end end end