从共享视图目录渲染部分集合

时间:2015-07-16 00:01:15

标签: ruby-on-rails ruby

这是我的索引操作:

def index
  @cats = Cat.all
end

这是索引视图:

#views/cats/index.html.erb
<h1>Listing Cats</h1>
<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Meows</th>
    </tr>
  </thead>
  <tbody>
    <%= render partial: "shared/animal", collection: @cats %> 
  </tbody>
</table>

这部分位于shared文件夹中,用于显示每只猫:

# views/shared/_animal.html.erb
# I purposely did not name it views/shared/_cat.html.erb 
<tr>
  <td><%= cat.name %></td>
  <td><%= cat.age %> </td>
  <td><%= cat.meows %> </td>
</tr>

以下是我遇到的错误:

  

`未定义的局部变量或方法'cat'用于#&lt; #`

我错过了什么?

2 个答案:

答案 0 :(得分:1)

应该是animal而不是cat - 您的部分名为_animal.html.erb,在其中,您可以引用animal来获取正在呈现的实例。

<tr>
  <td><%= animal.name %></td>
  <td><%= animal.age %> </td>
  <td><%= animal.meows %> </td>
</tr>

答案 1 :(得分:1)

您获得的错误undefined local variable or method 'cat' for #<#表示您没有'cat'

所以你应该使用一个可从你的视图中访问的变量,迭代@animals列表就是你想要做的事情我认为这是一个解决方案。

如果要使用partial shared / animals

,可以将@cats重命名为@animals

但您还要迭代在控制器中检索的数组

您可以使用以下代码作为解决方案:

控制器:

def index
   @animals = Cat.all  # or Dog.all ...
end

索引视图:

#views/cats/index.html.erb
<h1>Listing Cats</h1>
<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Meows</th>
    </tr>
  </thead>
  <tbody>
    <%= render partial: "shared/animals", collection: @animals %> 
  </tbody>
</table>

动物部分观点:

# views/shared/_animals.html.erb
# because I am using this as a basis for a bigger issue I'm trying to figure out
<% @animals.each do |animal|%>
  <tr>
    <td><%= animal.name %></td>
    <td><%= animal.age %> </td>
    <td><%= animal.meows %> </td>
  </tr>
<% end %>