2016-11-23 87 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