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') %>

这将为我的表单提供默认数据。如果默认数据不存在,我需要它只是空的(这就是为什么我试图用包含 name、age 和 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

代码气味。

在这里忘记哈希,否则您将进行无休止的黑客攻击。

设置默认值的正确方法是在控制器级别,甚至模型级别设置实例变量值。

然后在View中,正常引用实例变量的属性/方法即可。

例如

# In controller
@pet.name = "Dog"

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

然后在浏览器中,文本字段将预先填充“狗”。简单的。

于 2013-06-06T06:35:09.603 回答
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 ,这又显示空白。同样,您可以为其他属性传递值:agepet_type_id

于 2013-06-06T06:10:54.130 回答
0

您正在访问一个散列,就好像键是它上面的方法,这是由这个错误解释的

{:name=>"", :age=>"", :pet_type_id=>""}:Hash 的未定义方法 `name'

有几种方法可以解决这个问题。您可以尝试的一件事是使用 aStruct而不是哈希来初始化@pet_storage,但我认为这太过分了。最简单的方法是先检查是否@pet_storage存在

<%= text_field_tag "pet[][name]", @pet_storage ? @pet_storage[t].name : '' %>&nbsp;

这样,您不必在控制器中设置任何内容。

于 2013-06-06T06:12:07.670 回答
0

"name" 是 @pet_storage[t] Hash 的一个键。所以你必须像访问

@pet_storage[t][:name]
于 2013-06-06T06:13:33.057 回答