Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 未知嵌套变量无法确定是否存在嵌套子。。。。事物,总是被称为“错误”_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 未知嵌套变量无法确定是否存在嵌套子。。。。事物,总是被称为“错误”

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 = [

好的,我在Ruby中有以下变量:

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