【问题标题】:Devise: Adding first_name to Users设计:将 first_name 添加到用户
【发布时间】:2011-07-17 05:29:13
【问题描述】:

Rails 3.1
设计 1.4.2

我在设计的用户表中添加了 first_name 和 last_name 列。 然后我习惯于控制台为我的第一个用户添加 first_name 和 last_name。

现在,我的application.html.erb 显示我的名字和姓氏,这要归功于在我确定用户已登录后的以下代码:

<%= current_user.first_name %> <%= current_user.last_name %>(<%= current_user.email %>)

这是我的问题:当我尝试通过我创建的新用户表单注册新用户时,first_name 和 last_name 未存储在数据库或其他东西中......因为当我使用新用户登录时我的application.html.erb 上的代码不显示名字和姓氏。

这是new.html.erb 中名字和姓氏的文本字段:

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

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

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

我还想知道如何为我创建的这些新列(名字和姓氏)添加验证。

提前致谢!

【问题讨论】:

    标签: ruby-on-rails devise


    【解决方案1】:

    导轨 3

    默认情况下,devise 会保护所有属性。对于您希望能够批量分配的任何属性(例如通过表单),您需要在模型中明确允许它:

    attr_accessible :first_name, :last_name
    

    它在您的控制台中有效,因为您可能做了这样的事情:

    @user = User.first
    @user.first_name = "foo"
    @user.save
    

    但如果属性不可访问,这将不起作用:

    @user = User.new(:first_name => "foo")
    @user.save
    

    您应该会在日志文件中看到“无法批量分配受保护属性”的警告。

    如需验证,请查看Rails docsthis guide。例如,要确保提供全名,请添加

    validates_presence_of :first_name, :last_name
    

    到你的模型。

    【讨论】:

    • 我认为我必须对设计列的字段名称使用不同的语法:(谢谢 man
    【解决方案2】:

    Rails 4+

    我已经解决了这个问题。它也适用于 rails 4+。

    第 1 步:运行新迁移

    $ rails 生成迁移 AddFieldToUsers first_name:string last_name:string

    或者,您可能希望将列更改为null: false 并在用户模型validates presence: true 内。

     class AddFieldToUsers < ActiveRecord::Migration[6.1]
      def change
        add_column :users, :first_name, :string, null: false
        add_column :users, :last_name, :string, null: false
      end
     end
    

    $ rake db:migrate

    第 2 步: 在设计视图上添加这些代码。如果您还没有生成它们,您需要:rails generate devise:views users

      # app/views/devise/registrations/edit.html.erb
      # app/views/devise/registraitons/new.html.erb
    
      <div class="field">
        <%= f.label :first_name %><br />
        <%= f.text_field :first_name, autofocus: true %>
      </div>
    
      <div class="field">
        <%= f.label :last_name %><br />
        <%= f.text_field :last_name %>
      </div>
    

    第 3 步:将此添加到您的应用程序控制器

      # app/controllers/application_controller.rb
    
      before_filter :configure_permitted_parameters, if: :devise_controller?
    
      protected
    
      def configure_permitted_parameters
        added_attrs = %i[first_name last_name email password password_confirmation remember_me]
        devise_parameter_sanitizer.permit :sign_up, keys: added_attrs
        devise_parameter_sanitizer.permit :account_update, keys: added_attrs
      end
    

    【讨论】:

      【解决方案3】:

      我想,你忘了为你的新属性设置attr_accessible

      【讨论】:

        【解决方案4】:

        将以下内容添加到您的应用程序控制器中

        protected
        
            def configure_permitted_parameters
                devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:first_name, :last_name, :profile_name, :email, :password, :password_confirmation) }
                devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :profile_name, :email, :password, :password_confirmation) }
        
        
            end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-20
          • 2012-08-13
          • 1970-01-01
          • 1970-01-01
          • 2016-04-18
          • 2015-03-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多