0

我正在看一本书的例子。在 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而不是@products。有人可以再解释一下吗?

4

4 回答 4

1

Ruby 中有三种类型的变量:

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

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

于 2013-01-20T20:37:24.813 回答
1

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

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

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

于 2013-01-20T20:47:09.880 回答
1

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

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

于 2013-01-20T20:32:39.797 回答
1

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

于 2013-01-20T20:34:46.423 回答