了解“button_to”的工作原理

时间:2013-01-21 21:43:04

标签: ruby-on-rails ruby-on-rails-3.2

在此代码中:

<

    % @products.each do |product| %>
      <div class="entry">
        <%= image_tag(product.image_url) %>
        <h3><%= product.title %></h3>
        <p><%= sanitize(product.description) %></p>
        <div class="price_line">
          <span class="price"><%= number_to_currency(product.price) %></span>
    <!-- START_HIGHLIGHT -->
          <%= button_to 'Add to Cart', line_items_path(product_id: product),
            remote: true %>
    <!-- END_HIGHLIGHT -->
        </div>
      </div>
    <% end %>

在我们有button_to方法的底部,传递了参数:

    <%= button_to 'Add to Cart', line_items_path(product_id: product),
        remote: true %>

查看代码,这是我对正在发生的事情的理解,我是否理解正确或者我错过了什么?

  

在该代码中,我们创建了一个文本为“添加到购物车”的按钮,然后我们就是   将产品变量的product_id传递给它,即将到来   从那个for-each循环顶部并告诉它转到link_items页面   ID为product_id的产品的POST方法。

另外一个问题:在lines_items_path中我们可以通过product.product_id吗?或那不起作用?

1 个答案:

答案 0 :(得分:1)

我只是理解你的另一个问题。答案是:代码将product.id的值分配给符号product_id。符号product_id即将用于下一步(可能用于创建关联,其中product_id的值将成为关键)。您的问题“为什么只是product,而不是product.id”才是合理的。答案是在Rails框架的约定中 - 如果你想使用对象的ID,你只需省略.id部分,Rails就可以正确猜测。

您无法通过product.product_id,因为型号产品没有product_id方法或属性(您更喜欢哪个)。它有.id

请澄清问题的第一部分。

编辑(问题的第一部分 - 一步一步)

@products.each do |product| - 循环遍历一个对象数组(@products是对象数组,由控制器的动作组成,如:@products= Product.all或类似的)。在每一步中,do .. end内的代码都对局部变量product进行操作。这是一个对象,它对应于数据库的一行,因此它具有“属性”(对应于列),如product.id,product.name等。

然后,您可以创建与提取的数据库行数一样多的按钮。

关于按下哪个按钮的信息由新变量携带(在这种情况下以符号的形式 - 一个特殊的Ruby术语,值得研究:))因此,您将product.id的值赋给它,像这样:product_id: product.id。摘要:您编写了局部变量product_id。此代码的旧样式::product_id => product更具描述性。