如何在轨道上的ruby中显示选择字段值而不是相关的存储整数?

时间:2012-06-10 20:58:42

标签: ruby-on-rails ruby ruby-on-rails-3.2

比如说我允许我的用户在表单中选择他们的性别和婚姻状况,然后发布该表单,以便他们的选择存储在数据库中。

表单可能如下所示:

<select id="profile_marital_status" name="profile[marital_status]"><option value=""> Select</option>
<option value="1">Single</option>
<option value="2" selected="selected">Dating</option>
<option value="3">In relationship</option>
<option value="4">Married</option>
<option value="5">Living Together</option>
<option value="6">Divorced</option>
<option value="7">Separated</option>
<option value="8">Widowed</option></select><br />

要访问它并在视图中显示存储的数据,我会这样做@ profile.marital_status。问题是它将显示存储在db中的整数。

要解决这个问题,我目前正在使用辅助方法:

def get_gender(number)
  if number == 1
    'Male'
  elsif number == 2
    'Female'
  end
end

def get_marital_status(number)
  if number == 1
    'Single'
  elsif number == 2
    'Dating'
  elsif number == 3
    'In relationship'
  elsif number == 4
    'Married'
  elsif number == 5
    'Living Together'
  elsif number == 6
    'Divorced'
  elsif number == 7
    'Separated'
  elsif number == 8
    'Widowed'
  end
end

然后在视图中

= get_gender(@profile.gender)
= get_marital_status(@profile.marital_status)

这似乎是错误的,因为当我进入舞台时,当我需要显示用户注册的国家时,我不会看到自己输入带有国家列表的长if语句。

必须有一种更加切合实际的方法来做到这一点。我将很感激我可以显示选择字段值的任何解决方案,例如“男性”而不是存储在数据库中的内容,例如1或“女性”2。

更新

在我的ApplicationsHelper中,我有一个存储在数组中的国家/地区的完整列表:

 COUNTRY_AND_ISO_CODE   = [
      ['Any', nil],
      ['United Kingdom', 826],
      ['United States', 840],
      ['-----------', ' '],
      ['Afghanistan', 4],
      ['Ãland Islands', 248],
      ['Albania', 8],
      ['Algeria', 12],
      ['American Samoa', 16],
      ['Andorra', 20],
      ['Angola', 24],
      ['Anguilla', 660],
      ['Antarctica', 10],
      ['Antigua and Barbuda', 28],
      ['Argentina', 32],
      ['Armenia', 51],
      ['Aruba', 533],

将此视为我的观点:

= ApplicationHelper::COUNTRY_AND_ISO_CODE[@profile.country]

在我的视图中显示此结果:

 ["Sudan", 729]

我只需要弄清楚如何提取国家名称,或者除了字符串以外的所有内容。

几个月前我已经输入了完整的国家/地区名称及其ISO代码列表,这样可以节省大量时间。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

首先,您的代码可以重构为使用case

def get_gender(number)
  case number
  when 1 then 'Male'
  when 2 then 'Female'
  end
end

def get_marital_status(number)
  case number
  when 1 then 'Single'
  when 2 then 'Dating'
  when 3 then 'In relationship'
  when 4 then 'Married'
  when 5 then 'Living Together'
  when 6 then 'Divorced'
  when 7 then 'Separated'
  when 8 then 'Widowed'
  end
end

其次,<option>标记的内容未随表单一起提交,因此绝对无法在服务器上访问它们。您有以下选择:

  • 保持原样。
  • 将存储在数据库中的值更改为实际的字符串值而不是数字,这样就可以以数据库中的某些空间为代价删除模糊处理。
  • 对字段进行非规范化,为值创建单独的表,因此存储的数字现在是另一个表中的ID。

答案 1 :(得分:0)

这是我的解决方案。我在几个月前创建了数组,用于处理用户配置文件详细信息的编辑,因此我使用数据库中存储的整数来获取我想要的结果。

在我的ApplicationsHelper中,我有一个存储在数组中的国家/地区的完整列表:

 COUNTRY_AND_ISO_CODE   = [
      ['Any', nil],
      ['United Kingdom', 826],
      ['United States', 840],
      ['-----------', ' '],
      ['Afghanistan', 4],
      ['Ãland Islands', 248],
      ['Albania', 8],
      ['Algeria', 12],
      ['American Samoa', 16],
      ['Andorra', 20],
      ['Angola', 24],
      ['Anguilla', 660],
      ['Antarctica', 10],
      ['Antigua and Barbuda', 28],
      ['Argentina', 32],
      ['Armenia', 51],
      ['Aruba', 533],

将此视为我的观点:

= ApplicationHelper::COUNTRY_AND_ISO_CODE[@profile.country].first

在我的视图中显示此结果:

 United Kingdom