我有另一個模型的潛在多個孩子家長模型和嵌套屬性的Rails的形式。爲什麼直接操縱Rails表單參數散列考慮代碼味道?
子模型具有在邏輯操作作爲陣列的屬性,但是序列化使用的Rails一個YAML串內置serialize方法。
在形式,我顯示該陣列的每個單獨的構件,使得用戶可以選擇性地刪除成員。
的問題,當用戶銷燬所有成員發生。表單不會將任何參數值傳遞給Rails控制器,並且在調用UPDATE操作時,它將忽略該屬性,因爲在形式參數散列中沒有鍵。這當然是一個已知的問題,比如複選框,所以Rails會爲每個複選框自動放置2個複選框HTML元素,其中一個隱藏,只有在複選框被選中時纔會處理。
我不處理這裏的複選框,而是隱藏輸入文本字段。
我實現的解決方案是直接操作params哈希表在控制器的UPDATE操作,像這樣:
params[:series][:time_slots_attributes].each { |k,v| v[:exdates] ||= [] }
這被認爲是代碼味道?
我應該代替添加一個額外的隱藏字段被禁止,只被啓用,當用戶刪除最後一個成員?這個解決方案也適用,但對我來說似乎很笨拙。
@Deefour,不解決這個問題。問題是,當通過UPDATE操作處理params哈希時,需要將一個空數組寫入數據庫。我想我可以檢查一下參數值是否存在,如果不存在,我可以根據需要分別更新每個孩子的屬性。 – Ben 2012-07-13 15:34:52
類似這樣的:'params [:series] [:time_slots_attributes] .each_with_index do | attribs,idx | @ series.time_slots [idx] .update_attribute(:exdates,[])除非attribs [1] .has_key?(:exdates) end' – Ben 2012-07-13 15:52:22
你問是否是代碼異味;這是我回應的唯一的事情。 – deefour 2012-07-13 15:55:26