2016-11-23 41 views
1

救我有這個在我的控制器Rails的JSON:空/空數據不會在數據庫

@geo.message_notification = { 
    trigger_event: params[:ng_geo][:trigger_event], 
    ptc: { 
    id: params[:ng_geo][:ptc] 
    }, 
    message: params[:ng_geo][:message], 
    mode: params[:ng_geo][:mode], 
    remind_interval: params[:ng_geo][:remind_interval], 
    document: { 
    id: params[:ng_geo][:document] 
    } 
}.to_json 

會產生JSON:

{ 
    "trigger_event":"IOR", 
    "ptc": 
    { 
    "id":"184" 
    }, 
    "message":"could you please be faster?", 
    "mode":"", 
    "remind_interval":"", 
    "document": 
    { 
    "id":"234" 
    } 
} 

正如你可以在JSON看到,空數據(模式& alerts_interval)仍然保存在數據庫中。如何避免這種情況只會產生attr數據:

{ 
    "trigger_event":"IOR", 
    "ptc": 
    { 
    "id":"184" 
    }, 
    "message":"could you please be faster?", 
    "document": 
    { 
    "id":"234" 
    } 
} 
+1

你可以做這樣的** hash.delete_if {|鍵,值| value.blank? } **刪除空值。這裏**散列**是你的JSON –

回答

2

嗯,在我看來,這裏有一些基本問題。

首先,控制器不是做這種東西的好地方。

其次,您應該將此邏輯傳遞給數據庫包裝器,如活動記錄或mongoid。

或者你可以做到快速和骯髒的:

@geo.message_notification = { 
... 
}.select{|_,v| !v.blank?}.to_json 
+0

它的作品,但不知何故,文件和它的ID仍然在輸出 '{「trigger_event」:「IOR」,「ptc」:{「id 「:」409「},」message「:」請問你能更快嗎?「,」document「:{」id「:」「}}' – AmirolAhmad

+0

這意味着問題出在你的數據庫設置中,必填字段。 –

+0

nope,還沒有驗證.. btw文件是JSON內部的json對象。這就是爲什麼它不會跳過這個文件 – AmirolAhmad

0

嘗試這種解決方案請:

ng_geo_params = params[:ng_geo].slice(:trigger_event, :ptc, :message, :mode, :remind_interval, :document).delete_if { |k, v| v.blank? } 
# OR if you can 
ng_geo_params = params.require(:ng_geo).permit(:trigger_event, :ptc, :message, :mode, :remind_interval, :document).delete_if { |k, v| v.blank? } 

message_notification_hash = {} 

ng_geo_params.each do |k, v| 
    if k == :ptc || k == :document 
    message_notification_hash[k] = { id: v } 
    else 
    message_notification_hash[k] = v 
    end 
end 

@geo.message_notification = message_notification_hash.to_json