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】:渲染视图时您正在发布更新。
<%= link_to "Order", Order.update(@order,:delivery_slot => slot) %>
您需要提供一个路径(或可用于生成路径的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 循环中更新的主要内容,如果未能解决你的问题,请参考以下文章
Rails 4 引发 ArgumentError(参数数量错误(2 对 1)):通过 AJAX POST 更新时
Ruby on Rails - 在填写表单时更新 collection_select