添加自定义字段/列以使用Rails设计4

时间:2013-04-30 10:34:26

标签: ruby-on-rails ruby-on-rails-4

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

大多数在线示例recommend using 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

文件:注册&gt;应用程序/视图/设计/注册/ 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 个答案:

答案 0 :(得分: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

答案 1 :(得分:26)

此解决方案应该可以使用 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

答案 2 :(得分:12)

从设计文档:

  

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

您应该查看下面的网址,找到最符合您需求的方法: https://github.com/plataformatec/devise#strong-parameters

答案 3 :(得分:1)

为Devise启用强参数而不是attr_accessible。为此,请使用该内容创建一个新的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
相关问题