为什么我的视图代码同时使用实例变量和局部变量?

时间:2013-01-20 20:26:35

标签: ruby-on-rails ruby instance-variables local-variables

我正在看一本书的例子。在Products模型的视图部分中,我看到了一些代码:

<table>
  <% @products.each do |product| %>
    <tr class="<%= cycle ('list_line_odd', 'list_line_even') %>">
      <td>
        <%= image_tag(product.image_url, class: 'list_image' %>
      </td>
    <td class ="list_description ">
       <dl>
           <dt> <%= product.title %> </dt>

请注意,顶部是使用 @products ,而表格中的最后一行使用产品而不是 @products 。有人能解释一下这个吗?

4 个答案:

答案 0 :(得分:1)

在您的示例中, @products 是一个响应Enumerator#each方法的集合。实际上,这通常意味着一个数组。然后,您将 @products 的每个元素作为 product 变量迭代地传递到块中。

换句话说, product 是执行循环时取自 @products 的单数元素。

答案 1 :(得分:1)

@products包含Product对象的集合。 product变量包含Product的一个实例。

答案 2 :(得分:1)

Ruby中有三种类型的变量:

  • 常规变量,仅在示例代码的范围product中可用
  • 实例变量,可在特定的类实例中使用。每个实例都有自己的实例变量集,在您的示例中为@products
  • 类变量,可在类的所有实例中使用。这些也可以直接访问(没有实例),@@variable(你没有这种类型的例子)

最后一行显示product,与@products完全不同。 @products由控制器的类实例填充(可能称为ProductsController)。它是产品列表,each()方法用于遍历每个列表项。在迭代循环中,product用于指定正在迭代的当前产品。

答案 3 :(得分:1)

在控制器和视图的上下文中,您在控制器中声明实例变量(以@ -symbol开头),以将它们传递给视图。

开头没有@ -symbol的变量是仅在有限范围内可用的变量,例如迭代的元素。

所以你将@products从控制器传递给视图。之后,您可以使用product作为@products变量元素的临时标识符来遍历元素。