0

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

表单可能如下所示:

<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。问题是它将显示存储在数据库中的内容,这将是一个整数。

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

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 代码的完整列表,这样可以节省大量时间。

有任何想法吗?

4

2 回答 2

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。
于 2012-06-10T21:10:34.793 回答
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
于 2012-06-10T21:48:49.443 回答