在Devise中为`User`添加名称属性

25

我试图给 Devise 提供的 User 模型添加一个 name 属性。我在数据库中添加了一个 "name" 列,并更改了注册视图,以便询问用户的姓名:

<h2>Sign up</h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <p><%= f.label :name %><br />
  <%= f.text_field :name %></p>

  <p><%= f.label :email %><br />
  <%= f.email_field :email %></p>

  <p><%= f.label :password %><br />
  <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></p>

  <p><%= f.submit "Sign up" %></p>
<% end %>

<%= render :partial => "devise/shared/links" %>

我可以登录,但是在登录后检查数据库时,name: nil。我需要在Devise的User控制器中添加一些东西吗?谢谢!


1
你也需要创建一个迁移,将“name”添加到用户数据库表中吗? - Sam Rose
8个回答

19

Rails 3

在用户模型中定位;

 attr_accessible :email, :password, :password_confirmation, :remember_me

并在末尾添加:name


12
Rails4中怎么办?因为那里没有attr_accessible这样的东西。 - NamiW
@namiheike 目前不确定 Rails 4 的答案是什么,但一个快速的解决方法是在你的 gemfile 中添加 gem 'protected_attributes'。然后你就可以使用 attr_accessible。 - jordan
对于Rails 4.0(及更高版本),使用强参数,请查看RailsApps项目中的**Rails and Devise**示例应用程序。 - Daniel Kehoe

13

Rails 5(实际上是 Devise 4)

测试版本:Rails 5.1.0(Devise 4.2.1)

无需使用 Devise 控制器。

只需将以下内容添加到您的 application_controller.rb 中:

before_action :configure_permitted_parameters, if:  :devise_controller?


protected

  def configure_permitted_parameters

    devise_parameter_sanitizer.permit(:sign_up, keys: [:name])

  end

devise_parameter_sanitizer.for在Rails 5中不再起作用(更准确的说,在Rails 5环境下预期使用的devise版本4中不支持此方法):请使用devise_parameter_sanitizer.permit避免出现undefined method 'for' for #<Devise::ParameterSanitizer错误。


10
将以下代码添加到application_controller.rb:
before_action :configure_permitted_parameters, if: :devise_controller?



protected
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
  devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
end

6

针对Rails 4版本

使用方法如下

protected
def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password, :password_confirmation, :remember_me) }
  devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:login, :username, :email, :password, :remember_me) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :password_confirmation, :current_password) }
end

在末尾添加额外的字段。

我应该在哪里添加这个?我需要创建一个user_controller吗? - Papouche Guinslyzinho
1
应用程序/controllers/application_controller.rb - PrivateUser

2
是的,在用户模型中将:name添加到attr_accessible中。

1
将以下代码写在ApplicationController类中...
before_action :configure_permitted_parameters, if:  :devise_controller?

      protected

      def configure_permitted_parameters
        devise_parameter_sanitizer.for(:sign_up) << :name  

0
 private

   def sign_up_params
     params.require(:user).permit(:name,:email,:gender,:age,:password,:password_confirmation) if params[:user].present?
   end

将此代码添加到扩展 Devise 默认注册控制器的控制器中


0

取消注释一些生成的代码:

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :configure_sign_up_params, only: [:create]

  protected

  def configure_sign_up_params
    devise_parameter_sanitizer.for(:sign_up) << :name
  end
end

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接