当each_with_index
与查询返回的array
active records
一起使用时以及当我调用模型的attributes
时。对undefined method
attribute
控制器
@user_contact_query=Usercontact.select("*")
@available_contacts_array=Array.new
@user_contact_query.each do |variable|
@user_query=User.find( :all,:conditions => ["id = ?",variable.relator_id])
@available_contacts_array.push(@user_query)
end
查看
<% @available_contacts_array.each_with_index do |variable, index| %>
<%= variable.email %>
<% end %>
答案 0 :(得分:1)
嗯,一步一步,因为这是相当糟糕的代码:
@user_contact_query = Usercontact.select("*")
这里的选择部分有点奇怪,我会使用.all
。否则这里没问题。
@available_contacts_array = Array.new
因为在下一行你分配一个数组无论如何都不需要在这里'初始化'这个变量,你可以省略那一行。 (大多数Ruby程序员在大多数情况下会使用[]
来初始化一个空数组)
@available_contacts_array = @user_contact_query.to_a
假设我们从查询中获取了一些记录,我们现在应该有一个包含用户联系对象的数组。在我理解发生了什么的情况下,一个简单的.all
会产生类似的效果。但假设Usercontact有email
,这很好,你期望它。
@user_contact_query.each do |variable|
@user_query = User.find(:all, :conditions => ["id = ?", variable.relator_id])
@available_contacts_array.push(@user_query)
end
现在,如果我做对了你做的是你浏览所找到的所有用户接触,找到与之相关的每个用户(可能不止一个),然后将结果附加到Usercontacts数组的末尾。因此,您可以在该阵列中混合使用Users和Usercontacts。 (如果两个人都有电子邮件,那么在你的视图中仍然可以工作,因为感谢鸭子输入Ruby不关心。但很可能其中一个都缺少email
)。此外,如果找到多个用户,则推送一组用户。并且数组肯定没有email
。
好的,通过编辑,它变得简单。当您使用:all
和find
时,您得到的不是记录而是记录数组(即使只有一个记录)。你可以这样做:
User.find(variable.relator_id)
然后会找到一条记录并将其推送到数组中。我想你应该这样做。
在Rails中有更好的方法可以做到这一点,但这需要正确定义模型,使用relator_id
看起来不太可能。
答案 1 :(得分:0)
首先请发布完整的错误消息。虽然没有看到错误,我可以肯定地告诉你,这个问题是由你在一个nil对象上调用一个方法引起的,即你认为某个值实际上并不存在。
除此之外,你真的应该更加关心你的代码。你现在的代码简直太可怕了。这相当于您的代码:
@available = []
UserContact.find_each do |contact|
@available << User.find(contact.relator_id)
end
另一种方法是使用#inject
@available = UserContact.all.inject([]) do |list, contact|
list << User.find(contact.relator_id)
list
end
最好的解决方案是在这里实际使用ActiveRecord关联。
P.S无论如何,你的代码没有多大意义。为什么要将用户联系人和用户都放入该列表?
答案 2 :(得分:-1)
你为什么不这样做?
控制人员的助手:
@array = Usercontact.select( "*" ).map do| variable |
User.find( :all,:conditions => [ "id = ?",variable.relator_id ])
end
查看帮助:
@array.each.with_index do| variable, index |
# ...
end
一般说明:您在@available_contacts_array
变量混合类型中使用,可能会导致错误,请不要这样做。