我有一个视图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
属性?
由于
答案 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
所以我认为当答案非常简单时我做错了。