Ruby on rails 未知嵌套变量无法确定是否存在嵌套子。。。。事物,总是被称为“错误”
好的,我在Ruby中有以下变量:Ruby on rails 未知嵌套变量无法确定是否存在嵌套子。。。。事物,总是被称为“错误”,ruby-on-rails,ruby,Ruby On Rails,Ruby,好的,我在Ruby中有以下变量: GroupOfPeople 我不能做 GroupOfPeople.persons |do| 它返回一个NoMethodError 但是,我可以做一个 Persons = GroupOfPeople.persons Persons.each {|n| # Do things } 然而,每个人,不管他们未知的变量类型是什么,可能有也可能没有特征。例如,有了他们,我可以打电话给 A_proper_hash = {} A_proper_list = [
GroupOfPeople
我不能做
GroupOfPeople.persons |do|
它返回一个NoMethodError
但是,我可以做一个
Persons = GroupOfPeople.persons
Persons.each {|n|
# Do things
}
然而,每个人,不管他们未知的变量类型是什么,可能有也可能没有特征。例如,有了他们,我可以打电话给
A_proper_hash = {}
A_proper_list = []
Persons = GroupOfPeople.persons
Persons.each {|n|
p n.id
A_proper_hash[:id] = n.id
A_proper_list << A_proper_hash
}
这个很好用。如果有可能有些人的值为零,我可以
A_proper_hash = {}
A_proper_list = []
Persons = GroupOfPeople.persons
Persons.each {|n|
n.middle_name.nil? ? A__proper_hash[:middle_name] = nil : A__proper_hash[:middle_name] = n.middle_name
A_proper_list << A_proper_hash
}
然而,有些人甚至没有变量,更不用说赋值为nil了。这使程序崩溃。我试过多种方法来解决这个问题
A_proper_hash = {}
A_proper_list = []
Persons = GroupOfPeople.persons
Persons.each {|n|
if n.key(:pet_name)
n.pet_name.nil? ? A__proper_hash[:pet_name] = nil : A__proper_hash[:pet_name] = n.pet_name
end
A_proper_list << A_proper_hash
}
上面返回的是NoMethodError
这也会返回NoMethodError
A_proper_hash = {}
A_proper_list = []
Persons = GroupOfPeople.persons
Persons.each {|n|
@n.respond_to?(:pet_name).should n.pet_name.nil? ? A__proper_hash[:pet_name] = nil : A__proper_hash[:pet_name] = n.pet_name
A_proper_list << A_proper_hash
}
这也会返回NoMethodError
A_proper_hash = {}
A_proper_list = []
Persons = GroupOfPeople.persons
Persons.each {|n|
if(respond_to? n.pet_name)
n.pet_name.nil? ? A__proper_hash[:pet_name] = nil : A__proper_hash[:pet_name] = n.pet_name
end
A_proper_list << A_proper_hash
}
我不知道如何在不崩溃的情况下检查这个变量,当我知道的所有检查都崩溃时,如果它不在那里
编辑:p n.inspect的示例如下:
#<User id: 55, middle_name: \"duke\">"
这里有很多问题 GroupOfPeople是ruby中的一个非常规变量名。作为一个人,一个适当的散列和一个适当的列表。查看更多信息。您应该使用变量,如组人、个人、适当的散列和适当的列表 您在许多地方都有输入错误,您使用了正确的散列而不是正确的散列 groupof people.persons do应该是:
group_of_people.persons.each do |person|
end
group_of_people.persons.map do |person|
%i(
id
middle_name
pet_name
).each_with_object({}) do |attr_sym, new_person|
new_person[attr_sym] = person.try(attr_sym)
end
end
…所以您不必执行Person=GroupOfPeople.persons分配
如《样式指南》中所述,对多行块使用do..end而不是大括号{}
如果要返回数组,可以执行以下操作:
group_of_people.persons.map do |person|
end
然后你可以做一些类似的事情:
group_of_people.persons.each do |person|
end
group_of_people.persons.map do |person|
%i(
id
middle_name
pet_name
).each_with_object({}) do |attr_sym, new_person|
new_person[attr_sym] = person.try(attr_sym)
end
end
…这将为您提供:
[
{:id=>1, :middle_name=>"Foo", :pet_name=>"Fluffy"},
{:id=>2, :middle_name=>"Bar", :pet_name=>nil},
{:id=>3, :middle_name=>nil, :pet_name=>"Bunny"}
]
[
{:id=>1, :middle_name=>"Foo", :pet_name=>"Fluffy"},
{:id=>2, :middle_name=>"Bar"},
{:id=>3, :pet_name=>"Bunny"}
]
如果您不想要这些零值,那么:
group_of_people.persons.map do |person|
%i(
id
middle_name
pet_name
).each_with_object({}) do |attr_sym, new_person|
new_person[attr_sym] = person.try(attr_sym) if person.try(attr_sym)
end
end
…这将为您提供:
[
{:id=>1, :middle_name=>"Foo", :pet_name=>"Fluffy"},
{:id=>2, :middle_name=>"Bar", :pet_name=>nil},
{:id=>3, :middle_name=>nil, :pet_name=>"Bunny"}
]
[
{:id=>1, :middle_name=>"Foo", :pet_name=>"Fluffy"},
{:id=>2, :middle_name=>"Bar"},
{:id=>3, :pet_name=>"Bunny"}
]
那个么,到底什么是人群?@red_威胁我希望我知道。它是另一个东西的一个经过修改的扩展,ActiveRecord我相信,经过了大量修改。我认为,若你们能为一组人提供一些样本数据,并提供你们想要的输出,那个将是很有帮助的。事实上,即使你绕过了你描述的问题,你也会在每次迭代中覆盖一个适当的散列。@Jvillian在我的文件中,我将输出到列表。我忘了包括它。@jvillian添加了一个示例shows promise,但它在new_person[attr_sym]=person.tryattr_sym说namererror?namererror:未定义的局部变量或方法“new_person”时出现了错误。你做了new_person={}吗?你有拼写错误吗?啊,我没听到那句话。我的错。谢谢!%我把里面的东西变成一系列符号。所以,%ifoo bar产生[:foo,:bar]。您可以同样轻松地使用数组[:foo,:bar]。我刚刚养成了使用%I的习惯。顺便说一句,%w生成一个字符串数组。所以,%wfoo bar产生[foo,bar]。