如何在Rails中的视图中访问不同的对象集合?

时间:2008-11-15 17:41:41

标签: ruby-on-rails ruby model-view-controller

我不确定如何搜索这个答案,所以我会继续问问。

在我的rails项目中,我有一个User模型和一个foo模型。用户可以分配一个或多个foo模型。我已经通过添加

完成了这项工作
has_many :foo, :through => :user_foo

在我的用户模型中。

现在,在我看来,我想显示所有foos的列表。不只是选择的那些(我将制作这些单选按钮,但这是另一个问题)。当我尝试这样做时(是的,我正在使用haml):

    - for foo in @foos

我收到此错误:

You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.each

我的假设是,这是因为@foos集合为空。在我的用户视图中访问此集合的正确方法是什么?

**编辑**

我认为我最初的问题有点令人困惑。我想弄清楚的第一个问题是如何从我的用户视图中访问一组foos。这种关系并不重要。我只想要一个系统中所有foos的列表。不只是分配给用户的那些。

3 个答案:

答案 0 :(得分:3)

我假设您的Foo课程中有belongs_to :user

您的控制器代码是什么样的?要显示所有的foos,它应该有这样的东西:

def index
  @foos = Foo.all
end

答案 1 :(得分:2)

要访问所有Foos,只需使用

@foos = Foo.all

在您的控制器中。

您之前遇到的错误,可以通过以下检查阻止nil对象错误:

- if @foos.empty?
  %p There are no Foos
- else
  ...

此外,迭代集合的最佳方法是使用#each方法,而不是for循环。例如:

- @foos.each do |foo|
  %p= foo.name

所以一个完成的例子是:

- if @foos.empty?
  %p There are no Foos
- else
  - @foos.each do |foo|
    %p= foo.name

答案 2 :(得分:0)

错误表明你foo对象是空的。

如果您希望所有Foo与当前用户对象相关联,请使用

my_user = User.find(1) # finds user with id no. 1
list_of_foos = my_user.foos # finds all foos associated with my_user

应该有效

如果您正在寻找所有foo,无论它们的关联如何,您都可以使用

list_of_foos = Foo.find(:all)

这可能不符合当前流行的Rails语法:自从我积极开展Rails开发以来已经有一段时间了,但如果我理解正确的问题,这应该对你有帮助。祝好运。