使用关联渲染部分集合

时间:2015-06-10 14:50:32

标签: ruby-on-rails associations

我正在尝试将@entries集合的部分内容呈现给共享视图。

在一个控制器中,我直接在视图中渲染所有@entries。

<%= render(:partial => '/shared/entry', :collection => @entries) %>

在另一个控制器上,我通过书签进行操作。因此,该集合是@ bookmarks.entries

<%= render(:partial => '/shared/entry', :collection => @bookmarks.entries) %>

这是我的/shared/_entry.html.erb:

  <div>
    <%= link_to_unless_current entry.tag_list, tag_path(entry.tag_list) %>
  </div>

我从书签控制器收到以下错误,但另一个控制器工作正常:

undefined method `tag_list' for #<Bookmark:0x007fad659b32b8>

看起来它发生了,因为即使认为该集合是@ bookmarks.entries,它仍然将其识别为书签而不是条目。如果我将视图更改为以下内容,则它适用于书签,但在另一个控制器上失败:

  <div>
    <%= link_to_unless_current entry.entry.tag_list, tag_path(entry.entry.tag_list) %>
  </div>

如何才能使书签收藏只是为了有条目?

1 个答案:

答案 0 :(得分:0)

这里发生的事情是您错误地使用了错误的语法,而且恰好有一个方法已经使用了Rails / Ruby中已有的名称。

如果你期待这个

@bookmarks.entries

返回Entry对象列表,然后就不会了。如果@bookmarks是Bookmark对象和@bookmark has_many :entries的集合,并且您希望获得与所有书签相关联的所有条目,则可以执行类似@bookmarks.collect(&:entries).flatten.uniq的操作。

所以,语法是错误的,并且应该中断,除了它恰好发生在包含在Rails集合类中的Enumerable模块有一个名为&#34; entries&#34;的方法,它返回一个项目数组,在本例中是所有Bookmark对象。因此,部分是期待一个条目并且它正在获取书签,而且该错误告诉您:您在书签对象上调用了tag_list