Rails - 在select_tag帮助器中手动将表单选项列为字符串是不是很麻烦?

时间:2014-12-16 05:57:02

标签: ruby-on-rails ruby

在select_tag帮助程序中手动将表单选项列为字符串是不是很麻烦?

另外,我想知道 - 我如何实际使用所选值来更新数据库?

  <div class="form-group">
    <%= f.label :sex %><br />
    <%= select_tag(:sex_id, options_for_select(
      [
        ["Not known", 0], ["Male", 1], ["Female", 2], ["Not applicable", 3]
      ]
    )) %>

2 个答案:

答案 0 :(得分:2)

This question概述了使用enum in ActiveRecord (Rails 4.1+)映射到整数的过程。

数据库中类型integer的属性可以在相应的模型中声明(我假设为User):

enum gender: [:not_known, :male, :female, :not_applicable]

在视图中,您可能依赖于系统需要相应字符串而不是整数的事实:

<%= f.input :gender, as: :select, collection: User.genders.keys %>

或者自己绘制地图以生成您想要的内容:&#34;人类可读的名称&#34;甚至是i18n键:

<%= f.input :gender, as: :select,
      collection: User.genders.keys.map { |w| [w.humanize, w] } %>
<%= f.input :gender, as: :select,
      collection: User.genders.keys.map { |w| [(t ".w"), w] } %>

答案 1 :(得分:1)

将选项硬编码到视图中的方式往往会使查找变得困难,并且无法进行本地化/国际化。

有很多方法可以做得更好。以下是您可以考虑的内容。

使用提供枚举的模块,例如:

module Gender
  UNKNOWN = 0
  MALE = 1
  ...

使用常量哈希查找,例如:

GENDER = {
  0 => "Not Known",
  1 => "Male",
  ...

使用索引为id的常量数组,例如:

GENDER = [
 "Not Known",
 "Male",
  ...

使用一组结构,例如属性键值对:

GENDER = [
  {id: 0, label: "Not Known"},
  {id: 1, label: "Male"},
  ...

使用数据库表,例如:

class Gender < ActiveRecord::Base
   # has fields for id and name
end

使用Rails 4.1枚举:

class User < ActiveRecord::Base
  enum gender: [ :unknown, :male, ... ]
  ...

这些选项中的每一个都有优势。

  • 一般情况下,我建议将数据库表方法用于典型的Web应用程序或典型的API;表格方法有许多优点,可以更轻松地进行范围界定,搜索,排序,使用管理工具自动显示等。

  • 一般情况下,我建议使用模块方法,如果您需要高速,或者存储限制非常严格,或者想要将localizaiton / internationalization字符串保留在其他地方,例如YAML文件;模块方法存储了最少量的必要信息。

对于性和性别,请注意这些因地区和用户群而异。例如,一些国家有第三性别,有些情况需要“拒绝回答”,有些群体区分性别和性别等。