Rails - 如何添加一列以正确的方式设计自定义字段?

Rails - How to add a column to devise custom field in the right way?

我想在 Rails 上向设备 gem 添加用户的自定义字段,例如姓名、性别和描述。

我把代码放在那里 application_controller:

before_action :configure_devise_permitted_parameters, if: :devise_controller?

protected
def configure_devise_permitted_parameters
  registration_params = [:name, :sex, :description, :email, :password, :password_confirmation]

  if params[:action] == 'update'
    devise_parameter_sanitizer.for(:account_update) { 
      |u| u.permit(registration_params << :current_password)
    }
  elsif params[:action] == 'create'
    devise_parameter_sanitizer.for(:sign_up) { 
      |u| u.permit(registration_params) 
    }
  end
end

并生成迁移以将这些字段添加到用户 table:

class AddNameSexDescriptionToUsers < ActiveRecord::Migration
  def change
    add_column :users, :name, :string
    add_column :users, :sex, :integer
    add_column :users, :description, :text
  end
end

这里我将性别列设置为整数,但我想在视图页面上显示字符串,如男性、女性、未知。

我想在下拉列表框中显示列表。

这里我更改了装置的registrations/edit.html.erb来源:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put }) do |f| %>
<!-- etc. -->
<div class="form-group">
  <%= f.label :sex %><br />
  <%= f.select :sex, ?, class: "form-control" %>
</div>
<!-- etc. -->
<% end %>

如果我创建性模型,我可以这样设置 f.select

<%= f.select :sex, Sex.all.map{|t| [t.name, t.id]}, class: "form-control" %>

但是我觉得没必要做一个table只存三个记录。那怎么才能对性好呢?

我想你想要的是enum,这允许你定义一个散列,并将散列键存储在数据库中,它是一个整数,但取值是字符串

在模型中它看起来像这样

Model < ActiveRecord::Base
  enum sex: [ :male, :female, :unknown ]
end

您还可以添加辅助方法

def self.sexes_for_select
  sexes.keys.map{ |x| [x.humanize, x] }
end

在视图中

<%= f.select :sex, Model.sexes_for_select, class: "form-control" %>