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" %>
我想在 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" %>