2013-11-23 27 views
34

我向控制器發送關聯ID數組,例如foo_ids。要允許值的數組,我使用:現在Rails - 空陣列的強參數

params.permit(foo_ids: []) 

,問題是,如果我發送的foo_ids空數組,該參數將被忽略。不應將所有foos作爲空數組進行清除,而是關聯,因爲不允許使用foo_ids

這可能是因爲an empty array is converted to nil in rails,並且nil值被忽略,因爲強參數正在尋找一個標量值數組,而不是單個標量值。

任何人都可以提出一個很好的方法來解決這個問題嗎?謝謝!

其他信息

在更新控制器動作,我需要能夠處理兩種情況。我需要能夠將foo_ids設置爲空數組。如果我只想更新另一個字段,我還需要能夠忽略foo_ids。如果nil不適用於第二種情況,則將foo_ids設置爲空數組。

回答

18

治標不治本,我歸結爲是:

params[:foo_ids] ||= [] if params.has_key?(:foo_ids) 
params.permit(foo_ids: []) 

這裏,foo_ids設置爲僅傳遞了一個空數組。如果它未在請求中傳遞,則會被忽略。

我仍然希望找到一個更好的解決方案,因爲這種事情在我正在進行的項目中會很常見 - 如果您有任何問題,請提出更好的建議。

+0

我正在考慮猴子補丁的before_filter在那裏我會做些什麼來解決這個問題的是,在「_ids」結尾的所有鍵。想法? – futbolpal

+1

這會工作。我有一些情況下需要爲嵌套在哈希中的參數做這個工作,所以您可能也想根據您的使用情況來處理這些參數。 –

28

這是很晚了,但我自己只是有這個問題。我解決它通過包含在permit語句標版和數組版本,像這樣:

params.require(:photo).permit(:tags, tags: []) 

僅供參考 - 它中都有相同的permit語句 - 如果你把它們連它會得到因某種原因被拋出。

編輯:我只注意到,通過這種方法提交的空數組將被轉換爲零 - 我現在有一堆字段,應該是空的數組是零。所以我發佈的解決方案實際上並不適合我。

編輯第二個:以爲我已經添加了這個,但是這個問題與Rails在params哈希上執行deep_munge有關。這個評論解釋瞭如何解決它:https://stackoverflow.com/a/25428800/130592

0

我最近有同樣的問題,但沒有答案在這裏爲我工作。這是我的解決方案。如果你有JavaScript處理HTTP請求,這也可能適用於你。

在您的客戶端:

if (photo.tags.length === 0){ 
    photo.tags = ["null"] 
} 

並在您PhotosController

def photo_params 
    p = params.require(:photo).permit(tags: []) 
    p["tags"].reject! { |tag| tag == "null" } 
    p 
end