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 ステートメントを入力しているのが見えないため、これは間違っているようです。

これを行うには、もっと実用的で賢明な方法が必要です。DBに保存されていたもの(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 に答える