39

我正在尝试向我的用户模型(使用gem)和 Rails 4添加一个full_name字段/列。devise

大多数在线示例都推荐使用 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 %>
.
.
.
4

4 回答 4

66

一旦您的模型具有其 full_name 属性,您将必须为 #sign_up 和 #account_update 设计操作配置允许的参数。

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
于 2013-07-20T03:27:49.053 回答
26

该解决方案应该可以使用sign_upupdate

  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
于 2013-12-24T11:46:21.733 回答
12

从设计文档:

当您自定义自己的视图时,您最终可能会向表单添加新属性。Rails 4 将参数清理从模型移到了控制器,导致 Devise 也在控制器上处理这个问题。

您应该检查下面的 url 以找到最适合您需求的方法: https ://github.com/plataformatec/devise#strong-parameters

于 2013-07-16T13:44:15.163 回答
1

为设计启用强参数而不是 attr_accessible。为此,请使用该内容创建一个新的初始化程序:

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
于 2013-07-14T02:47:51.123 回答