Rails 4更新内部for循环

时间:2014-09-27 19:13:10

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

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

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

然后我在每个投放广告位旁边都有一个链接,点击后会将delivery_slot上的字段Order更新为点击的投放广告位的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)为什么所有订单链接都被&#34;点击&#34;在练习中只点击1时。
2)是否有更好的方法来更新订单上的delivery_slot属性?

由于

2 个答案:

答案 0 :(得分:0)

渲染视图时发出更新。

<%= link_to "Order", Order.update(@order,:delivery_slot => slot) %>

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

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

由于link_to没有获得有效路径,因此实际的HTML链接并未指向任何内容。点击它将是一个无操作。

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

答案 1 :(得分:0)

所以我终于得到了答案:

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

我认为最终绊倒我的是我的强参数:delivery_slot_id而我指的是:delivery_slot所以我认为当答案非常简单时我做错了。