Rails 4 在 for 循环中更新

Posted

技术标签:

【中文标题】Rails 4 在 for 循环中更新【英文标题】:Rails 4 update inside for loop 【发布时间】: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 吗? 【参考方案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,所以当答案非常简单时,我认为我做错了。

【讨论】:

以上是关于Rails 4 在 for 循环中更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 For 循环中为多个类别有条件地更新值

Rails 4 引发 ArgumentError(参数数量错误(2 对 1)):通过 AJAX POST 更新时

Ruby on Rails - 在填写表单时更新 collection_select

@mentions for Users with ActionText in Rails6; Rails6.1更新。

更新方法不更新rails 4中的记录

尝试在 for 循环中更新嵌套的 ArrayList