【问题标题】:understanding how "button_to" works了解“button_to”是如何工作的
【发布时间】:2013-01-21 21:43:04
【问题描述】:

在这段代码中:

<

    % @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 %>

查看代码,这是我对正在发生的事情的理解,是我理解正确还是遗漏了什么?

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

另一个问题: 在lines_items_path 中我们可以只传递product.product_id 吗?还是不行?

【问题讨论】:

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


    【解决方案1】:

    我认为这是Agile Web Development with Rails 书中的一个例子。很久以前看过了……如果没记错的话,有productsordersline_items

    如果您调用rake routes,您将发现line_items_path 作为POST,是line_items_controllercreate 操作的路由。更多详情:CRUD verbs and actions

    因此,您将 product_id 传递给 create 操作,您应该有类似的内容:

    def create
      product = Product.find(params[:product_id])
    ...
    end
    

    【讨论】:

    • 是的,那本书。感谢您的解释。
    【解决方案2】:

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

    您不能通过 product.product_id ,因为模型 Product 没有 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 =&gt; product 更具描述性。

    【讨论】:

    • 谢谢,我正在阅读您对我的第二个问题的回答以了解它。我还更新了问题的第一部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2012-02-13
    相关资源
    最近更新 更多