23

Rails 3.2アプリで、外部API呼び出しからデータを取得する選択フィールドを追加しようとしています。このデータは、ハッシュの配列として返されます。

[{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]

このデータを使用して、次のような選択フィールドを作成するにはどうすればよいですか。

<select>
  <option value="001"> NameA </option>
  <option value="002"> NameB </option>
</select>

編集:

以下の提案のおかげで、私は以下を試しました:

A:

<%= select_tag 'model[field]', options_from_collection_for_select(@hash, :id, :name) %>

エラーが発生します:

undefined method `name' for {"name"=>"NameA", "id"=>"001"}:Hash

B:

<%= select_tag 'model[field]', options_from_collection_for_select(@hash) %>

エラーを修正しますが、間違ったマークアップを生成します

<option value="{"name"=>"NameA", "id"=>"001"}"> {"name"=>"NameA", "id"=>"001"}</option>

したがって、私の問題はハッシュの配列を正しくフォーマットすることだと思います。これを行う方法を理解するためにハッシュの配列を操作することについては十分にわかりません。

完全に摩耗した方向を見ているのでない限り、この問題の鍵は、この質問の上部にある配列を再フォーマットして次のようにすることだと思います。

{"NameA" =>"001", "NameB" =>"002"}

これも可能ですか?もしそうなら、どのように?

4

6 に答える 6

40

このようなハッシュの配列がある場合:

@people = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]

次のような方法options_for_selectでヘルパーを使用できます。collect

= select_tag "people", options_for_select(@people.collect {|p| [ p['name'], p['id'] ] })

そして、それは完了しました:-)。

于 2013-11-11T10:43:13.937 に答える
17

1つのコマンドだけでそれを行うためのより良い方法:

<%= select_tag "model[field]", options_for_select(@array_of_hashes.map { |obj| [obj['name'], obj['id']] }) %>

あなたの例のハッシュで:

irb> @array_of_hashes = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
=> [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
irb> @array_of_hashes.map { |obj| [obj['name'], obj['id']] }
=> [["NameA", "001"], ["NameB", "002"]]
于 2013-07-31T06:54:12.197 に答える
2

私にとって、選択でハッシュを使用する最も簡単な方法は次のとおりです。

ハッシュ:

REVISION_TYPES={"S"=>"Stock", "T"=>"Traducción"}

フォーム:

select_tag(:revision_type,options_for_select(REVISION_TYPES.invert.to_a))
于 2016-11-08T16:11:37.443 に答える
1

options_for_selectこの目的に使用できます。2次元配列が必要です。次のようにハッシュを変換できます。

data = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
data_for_select = data.each { |hash| [hash['name'], hash['id']] }
options_for_select(data_for_select)

の補足として、options_from_collection_for_selectオブジェクトと組み合わせて使用​​されます。オブジェクトを反復処理し、ラベル用のメッセージとID用のメッセージを送信します。

于 2012-12-31T01:11:00.967 に答える
0

わかりました、私は最終的にはうまくいく解決策を見つけましたが、それは最善ではないかもしれません。

$ @array_of_hashes = [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
=> [{"name"=>"NameA", "id"=>"001"}, {"name"=>"NameB", "id"=>"002"}]
$ @formatted_array_of_hashes = @array_of_hashes.each.map{ |h| { h["name"] => h["id"] }}
=> [{"NameA" => "001"}, {"NameB" => "002"}]
$ @merged_hash = Hash[*@formatted_array_of_hashes.map(&:to_a).flatten]
=> {"NameA" => "001", "NameB" => "002"}

その後、選択フィールドを作成することができました

<%= select_tag 'model[field]', options_for_select(@merged_hash) %>

正しいマークアップを生成します

<select>
  <option value="001">NameA</option>
  <option value="002">NameB</option>
</select>

少し複雑ですが、機能しています。改善を歓迎します。

于 2013-01-04T15:30:25.753 に答える
0

理由はよくわかりませんが、どれもうまくいきませんでした。Rails 5のせいかもしれませんが、私は自分でそれを理解し、共有できてうれしいです。今ではきれいですが、うまく機能します。

これは、ユーザーのテーブルに関連付けたい外部API(Pipedrive)からのハッシュの配列です。

これは私の形です:

<%= form.collection_select(:id_user_pipedrive, Owner.all_id_name, :id, :name, :include_blank => '') %>

そして、これは私の偽のモデルにあります:

UserPipedrive = Struct.new(:id, :name)
def self.all_id_name
  all["data"].map { |d| UserPipedrive.new(d["id"],d["name"]) }
end

それが誰かを助けることを願っています。

于 2018-04-18T22:00:51.137 に答える