2014-03-25 61 views
0

我有這個Javascript函數,我用它來追加元素做我的表單。提交表單時,所有元素都以params形式傳入。檢查參數是否通過

這是問題所在。我的函數附加的元素是哈希的一部分。這基本上起到軌道「嵌套屬性」的作用。

所有似乎工作正常,除非其中一個「哈希」是空的。當我從集合中刪除所有元素時,哈希參數不會傳遞給控制器​​。

實施例(想象使用我JS函數所附本田,豐田,現代)

汽車 [本田] [豐田] [現代]

這是散列如何設置在JS功能(我每次點擊「添加」時間):

​​

如果我提交表單,該值將被作爲哈希傳遞到這樣的控制器:

cars_hash=>{tmp_cars=>"{"1"=>{car_brand=> "honda"},"2"=>{car_brand=> "toyoda"},"3"=>{car_brand=> "hyundai"}"} 

但是,如果我決定從哈希中刪除所有這些值(使用刪除按鈕,它也具有在JS函數中聲明的功能)並提交表單,哈希甚至不會作爲參數存在。然後,當我到達我的控制器,我嘗試填充我使用迭代變量/插入我的DB:

控制器

cars_hash = params[:cars_hash][tmp_cars] 

它給我這個錯誤:

undefined method `[]' for nil:NilClass 

我明白,這個參數並不存在,所以它基本上是零。我試過所有這些可能的選擇:

if not params[:cars]["tmp_cars"].blank? 
if not params[:cars]["tmp_cars"].empty? 
if params[:cars]["tmp_cars"].present? 
if params[:cars]["tmp_cars"] != nil 

但沒有運氣。任何人都可以建議我一種方法來讓這個工作?再說一遍,如果散列值是一個值,參數將不會爲零。爲了有一個值,必須通過JS函數將一個元素附加到文檔中。

+0

你的控制器裏有什麼? –

+0

我添加了一行給我的錯誤@Baloo –

+1

你的方法正在檢查'params [:cars]'是否基本存在。聽起來你想檢查是'params [:cars] [tmp_cars]'。你嘗試過'params [:cars] .has_key?(tmp_cars)'? – Zhihao

回答

1

嘗試做:

cars_hash = params[:cars_hash] && params[:cars_hash][tmp_cars] 

我會強烈建議installling andand的寶石,非常適用於這樣的情況。有了這個寶石可以WIRTE像上面這樣的代碼:

cars_hash = params[:cars_hash].andand[tmp_cars] 

UPDATE:

你的代碼是不工作,因爲params[:cars_hash]回到零上,您試圖調用[]方法,這樣的方法不定義爲nil對象。因此,在調用任何東西之前,您需要檢查params[:cars_hash]是否爲零。

&&運算符有這個不錯的屬性,它甚至沒有執行正確的參數whan左邊的參數是falsy - 這樣做沒有意義。由於ruby中的每個表達式都返回上次執行的命令的值,所以&&如果是虛假的(falsenil),則返回任何左表達式返回的值,否則它將在右側運行該表達式並返回其值。在Ruby的這個上下文中使用這個&&是很常見的。

+0

天才。這項工作!爲什麼?! –

+1

它實際上是一個更好的方式,像'cars_hash = params [:cars_hash] .nil? ? nil:params [:cars_hash] [「tmp_cars」]'。基本上,如果'params [:cars_hash]'是'nil',它不會嘗試檢查'params [:cars_hash] [「tmp_cars」]',這會產生錯誤。你不能在'nil'上做'[「tmp_cars」]''。 –

+0

感謝您的解釋傢伙!非常感激! –