【问题标题】:Rails 4 update inside for loopRails 4 在 for 循环中更新
【发布时间】:2014-09-27 19:13:10
【问题描述】:

我有一个视图show.html.eb,它显示Order 的详细信息,并显示订单date 的所有可用Delivery Slots

例如: 订单 1 2014 年 12 月 12 日 交货时段: 6.30 - 7.00 7.30 - 8.00 8.00 - 8.30

然后,我在每个交付槽旁边都有一个链接,单击该链接会将Order 上的字段delivery_slot 更新为单击的交付槽的Id

查看代码

<% @slots = DeliverySlot.all.select {|slot| slot.day == @order.date} %>
<% @slots.each do |slot| %>
    <%=slot.start_time.strftime("%I:%M%p") %> - <%=slot.end_time.strftime("%I:%M%p") %>  
    <%= link_to "Order", Order.update(@order,:delivery_slot => slot) %>
    <br>
<% end %>

问题是,当您单击一个订单链接时,所有订单链接都被单击(我可以通过终端中的 SQL 看到这一点),因此最终结果是 delivery_slot 字段始终填充最后一个交货槽的循环。

我很感激我在这里遗漏了一些东西,所以任何人都可以解释一下:

1) 为什么在实践中只点击 1 时所有订单链接都被“点击”。
2) 有没有更好的方法来更新订单上的delivery_slot 属性?

谢谢

【问题讨论】:

  • 你能发布一些生成的 HTML 吗?

标签: ruby-on-rails ruby-on-rails-4 view controller


【解决方案1】:

渲染视图时您正在发布更新。

&lt;%= link_to "Order", Order.update(@order,:delivery_slot =&gt; slot) %&gt;

您需要提供一个路径(或可用于生成路径的url_options)作为link_to 的第二个参数。相反,您正在调用 update 方法。因此,当您的视图被渲染时,您会遍历每个交付槽并为每个交付槽发布更新,正如您所指出的,最后一个会覆盖其他所有内容。

如果您观察日志,您将看到 SQL 语句出现在与show 请求对应的日志行中。您甚至在点击任何链接之前就已更新订单。

现在由于link_to 没有获得有效路径,实际的HTML 链接没有指向任何东西。点击它不会有任何操作。

ri link_to 是您需要阅读的内容。

【讨论】:

  • 谢谢。我曾尝试过这个(以及之前的许多其他不同的东西),但使用更新是我可以获得更新订单的唯一方法。现在我已将链接更改为` slot), :method => :put %> ` 但我收到以下错误:param is missing or the value is empty: order 和以下请求 @987654329 @ 有任何想法吗?强大的参数对我来说很好。
【解决方案2】:

所以我终于得出了答案:

<%= link_to "Order", order_path(order:{:delivery_slot_id => slot}), :method => :put %>

我认为最终让我感到困惑的是我的强参数特定于:delivery_slot_id,而我指定了:delivery_slot,所以当答案非常简单时,我认为我做错了。

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2011-09-26
    • 2020-11-29
    • 2013-04-29
    相关资源
    最近更新 更多