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

时间:2015-03-30 04:43:20

标签: ruby-on-rails ruby devise

我想在Rails上的设计宝石中添加用户的自定义字段,如名称,性别和描述。

我把代码放到我的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

并生成迁移以将这些字段添加到users表中:

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" %>

但我认为没有必要让一张表只保存三条记录。那么如何以良好的方式做到性爱呢?

1 个答案:

答案 0 :(得分:1)

我认为你想要的是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" %>