【问题标题】:How can I access a different object collection in a view in Rails?如何在 Rails 的视图中访问不同的对象集合?
【发布时间】:2008-11-15 17:41:40
【问题描述】:

我不知道如何搜索这个答案,所以我会继续问它。

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

has_many :foo, :through => :user_foo

在我的用户模型中。

现在,在我看来,我想显示所有 foo 的列表。不仅仅是那些被选中的(我将制作这些单选按钮,但这是另一个问题)。当我尝试这样做时(是的,我正在使用 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 的集合。关系无所谓。我只想要系统中所有 foo 的列表。不仅仅是分配给用户的那些。

【问题讨论】:

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


    【解决方案1】:

    我假设你的 Foo 类中有 belongs_to :user

    您的控制器代码是什么样的?要显示所有 foo,它应该有这样的内容:

    def index
      @foos = Foo.all
    end
    

    【讨论】:

    • 我的 foo 模型中没有这个。现在我已经添加了它,我得到了这个错误:在我的 foo 模型中找不到关联 :user_foo 在模型用户中,它应该是 belongs_to :user_foo 那么在 user_foo 中应该说是 belongs_to :foo 吗?这似乎也不对
    • 好的,所以我发现我的用户模型中也缺少 has_many :foo 。所以现在我有: has_many :user_foo has_many :foos, :through => :user_foo 我还需要在我的 userfoo 模型中添加 belongs_to :user belongs_to :foo 。所以这解决了我的外部参照问题。
    • 但我当前的问题是我无法从用户视图遍历系统中的所有 foo。所以我想忽略整个 x-ref 的东西,看它就像我只想在我的用户视图中循环遍历系统中的所有 foo。
    • 请发布完整的 User 和 Foo 模型代码以及您的控制器和视图代码。
    • 我在您的帮助下找到了我的问题。我需要如上所述设置 has_many 和属于,并且我在我的用户模型中添加了一个 foos 方法。但缺少的项目是,我需要从 BaseController 而不是 ApplicationController 继承我的应用程序。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      错误提示你 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 开发以来已经有一段时间了,但是如果我理解正确的问题,这应该会对你有所帮助。祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-07-22
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 2019-02-22
        • 1970-01-01
        • 2014-02-02
        相关资源
        最近更新 更多