2014-02-16 32 views
0

当我调用模型attributes。它说:undefined method,为attributeeach_with_index不工作的一个数组导轨

控制器

@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 %> 

回答

-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变量混合型使用you'be,大概这导致错误,请不要这样做。

+0

downvoter这是争论? –

+0

.select(“*”)是无意义的,应使用User.find(id)而不是User.find(:all,:conditions ...),并且您的each_with_index调用包含错字,即不起作用。我甚至不会开始格式化... –

+0

@TanelSuurhans这是错字?我不知道作者想用'select(“*”)'说什么。所以我只是复制了代码。 –

0

首先请发布您的完整错误信息。尽管没有看到错误,我可以肯定地告诉你这个问题是由你在一个无对象上调用方法引起的,也就是说你认为一个值实际上并不存在。

除此之外,你真的应该更加关心你的代码。你现在的代码简直太可怕了。这是你的代码的等效:

@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你的代码无论如何没有什么意义。为什么要将用户联系人和用户都放入该列表中?

+0

对不起,我正在尝试一些东西并将其发布到此处,而无需撤消更改 – user2749265

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,找到每一个与之相关的(可能不止一个)用户,然后在Usercontacts的数组的末尾附上结果。因此,您在该阵列中混合了用户和用户联系人。 (如果两者都有电子邮件,这仍然适用于你的观点,因为感谢鸭子打字Ruby不会在意,但最有可能的其中之一是缺少email)。此外,如果找到多个用户,则会推送一个用户数组。而且肯定有一个数组没有email

好吧,您的编辑变得简单。当你使用:allfind时,你得到的不是一条记录,而是一组记录(即使我们只有一条)。你可以这样做:

User.find(variable.relator_id) 

然后,它会找到一个单一的记录,并推动它在数组中。我猜是你期望它做的。

Rails会有更好的方法来做到这一点,但这需要正确定义模型,使用relator_id看起来不太可能。

+0

感谢您的回答,我犯了一个错误,我编辑了问题 – user2749265