2014-09-27 62 views
0

我有一個視圖show.html.eb,顯示Order的詳細信息,並顯示訂單的date的所有可用Delivery SlotsRails 4內部更新循環

例如: 訂單1 14年12月12日交付 時隙: 6.30 - 7.00 7.30 - 8.00 8.00 - 8.30

我然後有一個鏈路旁邊的每個輸出槽點擊它時,更新該字段delivery_slotOrderId被點擊的傳送位置。

查看代碼

<% @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屬性?

謝謝

+0

你可以發佈一些生成的HTML嗎? – Geremy 2014-09-27 19:32:56

回答

0

所以,我終於來到了答案:

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

我想絆倒我,到底是我堅強的參數的具體:delivery_slot_id,我被指定:delivery_slot,所以我認爲我做錯了什麼時答案很簡單。

0

您在渲染視圖時發出更新。

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

您需要提供(其可以被用於產生一個路徑或url_options)作爲第二個參數,以link_to的路徑。相反,您正在調用update方法。所以當你的視圖被渲染時,你遍歷每個交付槽併爲它們中的每一個發佈一個更新,正如你所指出的那樣,最後一個覆蓋了其他的一切。

如果您觀察您的日誌,您將看到SQL語句出現在與show請求對應的日誌行中。即使在單擊任何鏈接之前,您也正在更新訂單。

現在因爲link_to沒有得到有效的路徑,所以實際的HTML鏈接並沒有指向任何東西。點擊它將是一個無操作。

ri link_to是您需要閱讀的內容。

+0

謝謝。我曾嘗試過這個(以及其他許多不同的事情),但使用更新是我能夠更新訂單的唯一方法。現在我已經將鏈接更改爲'\t <%= link_to「Order」,order_path(:delivery_slot => slot),:method =>:put%>'但我得到以下錯誤:'參數丟失或者值爲empty:order' with the following request'{「_method」=>「put」, 「authenticity_token」=>「V/CN44leUhPq21qN/osUO/X6bFywYbbU3PlaOIRw/3o =」, 「delivery_slot」=>「1619」, 「 id「=>」51「}'有什麼想法?強大的參數看起來很好。 – blackfish64 2014-09-29 00:29:36