1

私はアプリケーションに取り組んでおり、ハッシュにまだ値がない場合は、空の値を入力する必要があります。@pet[] には 3 つのハッシュが含まれており、それぞれに :name、:age、および :pet_type_id が必要です。この変数の目的は、次のようにビューの select_tags を埋めるために使用することです。

<%= text_field_tag "pet[][name]", @pet_storage[t].name %>&nbsp;
<%= text_field_tag "pet[][age]", @pet_storage[t].age %>&nbsp;
<%= select_tag("pet[][pet_type_id]", options_from_collection_for_select(PetType.all, "id", "name", @pet_storage[t].pet_type_id), :prompt => 'Select a pet type') %>

これにより、フォームのデフォルト データが提供されます。デフォルトのデータが存在しない場合は、それを空にする必要があります (そのため、空の文字列値を持つ名前、年齢、pet_type_id キーを含むハッシュで @pet_storage を埋めようとしています。

これは、コントローラーで使用しているコードです。

unless defined?(@pet_storage)
@pet_storage = Array.new
RecordsHelper::ALLOWED_PETS.times { |t| @pet_storage[t] = {name:'', age:'', pet_type_id:''}}
end

ただし、このエラーが発生します

undefined method `name' for {:name=>"", :age=>"", :pet_type_id=>""}:Hash
Extracted source (around line #15):

12:         <%= f2.label :age %>&nbsp;
13:         <%= f2.label :pet_type_id, 'Type of pet'%>
14:         </br>
15:         <%= text_field_tag "pet[][name]", @pet_storage[t].name %>&nbsp;
16:         <%= text_field_tag "pet[][age]", @pet_storage[t].age %>&nbsp;
17:         <%= select_tag("pet[][pet_type_id]", options_from_collection_for_select(PetType.all, "id", "name",     @pet_storage[t].pet_type_id), :prompt => 'Select a pet type') %>
18:     </div>

これらの値をハッシュに保存できないのはなぜですか? 私がやろうとしていることを達成するためのより良い方法はありますか? ありがとう!

4

5 に答える 5

0

コードの匂い。

ここで Hash を忘れてください。そうしないと、無限のハッキングを行うことになります。

デフォルト値を設定する正しい方法は、コントローラ レベルまたはモデル レベルでインスタンス変数の値を設定することです。

次に、ビューで、インスタンス変数の属性/メソッドを通常どおり参照するだけです。

例えば

# In controller
@pet.name = "Dog"

# In view
<%= form_for @pet %>
  <%= text_field_for :name %>

次に、ブラウザのテキスト フィールドに「Dog」があらかじめ入力されます。単純。

于 2013-06-06T06:35:09.603 に答える
0

「name」は @pet_storage[t] Hash のキーです。したがって、次のようにアクセスする必要があります

@pet_storage[t][:name]
于 2013-06-06T06:13:33.057 に答える
0
arr = []

3.times do |i|
  arr[i] = {a: 1, b: 2}
end

puts arr[2][:a]  #=>1

puts arr[2].a

1.rb:7:in `<main>': undefined method `a' for {:a=>1, :b=>2}:Hash (NoMethodError)
于 2013-06-06T06:10:38.873 に答える
0

これは正しい方法ではありません。オブジェクトが存在する場合は対応する値を、そうでない場合は空白で埋めることを意図していることを願っています。値として渡しpet_storage.try(:name)ます。これは、存在する場合は値を取得するか、そうでない場合は nil を返し、空白を表示します。age同様に、他の属性に値を渡すことができます。pet_type_id

于 2013-06-06T06:10:54.130 に答える