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

Ruby on rails 为什么我的视图代码同时使用实例变量和局部变量?,ruby-on-rails,ruby,instance-variables,local-variables,Ruby On Rails,Ruby,Instance Variables,Local Variables,我正在看一本书的例子。在产品模型的“视图”部分,我看到了如下代码: <table> <% @products.each do |product| %> <tr class="<%= cycle ('list_line_odd', 'list_line_even') %>"> <td> <%= image_tag(product.image_url, class: 'list_image' %

我正在看一本书的例子。在产品模型的“视图”部分,我看到了如下代码:

<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。有人能再解释一下吗?

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

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

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


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

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

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

Ruby中有三种类型的变量:

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

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

Ruby中有三种类型的变量:

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

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

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

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


因此,您将@products从控制器传递到视图。之后,您可以使用product作为@products变量元素的临时标识符来迭代元素。

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

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

因此,您将@products从控制器传递到视图。之后,您可以使用product作为@products变量元素的临时标识符来迭代元素