1

ユーザープロファイルの詳細の編集を処理するために、数か月前に配列を作成しました。登録された国をバックユーザーに表示するときは、配列を利用して、データベースから保存された整数を使用して必要な結果を取得します。

私のユーザーモデルには、国の完全なリストが配列に格納されています。

# encoding: UTF-8
class User < ActiveRecord::Base   

     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],

これを私の見解に入れてください:

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

この結果を私のビューに表示します。例:

 United Kingdom

私が抱えている問題は、大規模な国の配列にあります。一部のプロファイルでは機能しているように見えますが、ほとんどの場合、このエラーが発生します。

 undefined method `first' for nil:NilClass

事実、すべてのプロファイルの@ profile.countryがゼロではないことを知っているので、このエラーがどこから来ているのかわかりません。配列への呼び出しを削除し、ビューに@ profile.countryがある場合、期待どおりに格納された整数が表示されます。

私は他の配列でこの問題を経験していません。例えば、martial_status、gender、sexuality。だから、これは配列とメモリのサイズと関係があるのだろうか、それとも何かなのだろうか?それが私が尋ねている理由です。

国名が保存された別のテーブルを作成し、プロファイルテーブルに保存された整数を使用して国テーブルから正しい国を取得することで、別の質問で提案された別のルートを使用することに近づいています。私が最初に1を持っていたとき、それはdbへの2つの呼び出しであるため、私はこれを避けたかったのです。

私の現在のコードで何が間違っている可能性があるか考えていますか?一部のプロファイルで機能し、他のプロファイルでは機能しない理由がわかりません。すべての国のユーザーを更新するrakeタスクを作成したので、保存されている国の整数を確認する必要はありません。

その他の質問:関連する格納された整数ではなく、選択したフィールド値をRuby on Railsで表示するにはどうすればよいですか?

あなたが助けることができることを願っています

また、私をマークダウンする場合は、理由を教えてください。私は私の過ちから学ぶためにここにいます、そして多分私の過ちは同様の問題で私の質問に出くわす他の人を助けることができます。

敬具

4

3 に答える 3

2

試す:

User::COUNTRY_AND_ISO_CODE.rassoc(@profile.country).try(:first)
于 2012-06-11T09:11:15.563 に答える
1

このUser::COUNTRY_AND_ISO_CODE[@profile.country].firstコードを機能させるにはハッシュが必要です。たとえば、配列をハッシュに置き換えるだけです。

COUNTRY_AND_ISO_CODE   = {
 'Any' => nil,
 'United Kingdom' => 826,
 'United States' => 840,
 # ..etc.
}

..そしてこのコードのテストを書くことを忘れないでください;)

于 2012-06-11T09:10:49.633 に答える
1

ary[index]インデックスで要素を返すので、

COUNTRY_AND_ISO_CODE[0] # => ['Any', nil]
COUNTRY_AND_ISO_CODE[1] # => ['United Kingdom', 826]
COUNTRY_AND_ISO_CODE[2] # => ['United States', 840]

の場合@profile.countryは、配列から826番目の要素826COUNTRY_AND_ISO_CODE[@profile.country]返すかnil、そのような要素がない場合を返します。

于 2012-06-11T09:25:21.127 に答える