2016-11-24 23 views
3

此表爲tbl_notification。讓說,我想產生JSON輸出是這樣的: -Rails 4 - 以單一形式在JSON對象中保存多個值和/或

[ 
    { 
    "trigger_event":"ONE", 
    "ptc": 
    { 
     "id":"184" 
    }, 
    "message":"this is message" 
    }, 
    { 
    "trigger_event":"TWO", 
    "ptc": 
    { 
     "id":"184" 
    }, 
    "message":"sasasd", 
    "remind_interval":"60", 
    "document": 
    { 
     "id":"" 
    } 
    } 
] 

所以在這個JSON只有2個主要對象(:trigger_event [ONE] & [TWO])。 ONE有3個散列,而TWO有5個散列。

對於數據庫方面,即時通訊使用PostgreSQL和列調用message_notification這是JSONB數據格式類型。

上面的JSON輸出在message_notification列下。

控制器(剛拔出JSON部分)

def create 
    @geofence.message_notification = { 
    trigger_event: params[:ng_geofence][:trigger_event], 
    ptc: params[:ng_geofence][:ptc], 
    message: params[:ng_geofence][:message], 
    remind_interval: params[:ng_geofence][:remind_interval], 
    document: params[:ng_geofence][:document] 
    }.to_json 
end 

型號(剛拔出JSON部分)

def as_hash(format=:google) 
    { 
    trigger_event: trigger_event, 
    ptc: { id: ptc }, 
    message: message, 
    remind_interval: remind_interval, 
    document: { id: document }, 
    } 
end 

TRIGGER_EVENTS = [ 
    ["ONE","ONE"], 
    ["TWO","TWO"] 
] 

查看(剛拔出JSON部分)

<%= f.select :trigger_event, Ng::Geofence::TRIGGER_EVENTS, { prompt: "-- Choose" } %> 
<%= f.input :ptc, collection: @pretrips, wrapper: false, label: false, selected: (x['ptc']['id'] unless f.object.new_record?), :include_blank => true %> 
<%= f.input :message, as: :string, label: false, wrapper: false %> 
etc 

如果:trigger_eventselect_tag,以上代碼正在工作。

所以,現在,我想從select_tag行爲改變爲check_box:trigger_event,這樣的事情(例如):

<%= f.input :trigger_event['ONE'], as: :boolean, label: 'ONE' %> 
<br/> 
<%= f.input :trigger_event['TWO'], as: :boolean, label: 'TWO' %> 

的原因是,我想要和/或形式是,用戶可以檢查現場形式ONE或檢查現場形式TWO或同時檢查現場形式ONE & TWO。

  1. 所以如果勾選ONE,:trigger_event, :message & :ptc {:id}將會保存。
  2. 如果檢查TWO,:trigger_event, :message, :ptc {:id}, :remind_interval & :document {:id}將保存。
  3. 如果同時檢查(ONE & TWO),會產生類似於上面的JSON輸出。

如何實現這一目標?

回答

0

我真的不明白你發現這個場景如此複雜。

由於沒有什麼特別之處這些複選框,只需使用HTML:

<input type="checkbox" name="trigger_events[one]" value="1"> 
<input type="checkbox" name="trigger_events[two]" value="1"> 

然後在你的控制器,你可以簡單地檢查哪些複選框已檢查,併產生相應的JSON:

def create 
    trigger_events = [] 

    if params[:trigger_events][:one] == '1' 
    trigger_events << { 
     trigger_event: 'ONE', 
     ptc: { id: 184 }, 
     message: 'this is message' 
    } 
    end 

    if params[:trigger_events][:two] == '1' 
    trigger_events << { 
     trigger_event: 'TWO', 
     ptc: { id: 184 }, 
     message: 'sasasd', 
     remind_interval: 60, 
     document: { id: '' } 
    } 
    end 

    @geofence.message_notification = trigger_events.to_json 
end 

PS因爲我不完全明白你的價值觀應該是什麼,所以我只是要硬核ptc s,message s等。將它們替換爲相應的params

P.P.S:trigger_event['ONE']相當於"trigger_event"["ONE"]或者換句話說,你試圖在字符串"trigger_event"這將導致nil指數"ONE"獲得象徵。

作爲參考,:trigger_event[0]將產生"t"(該符號的名稱的第一個字符)

+0

感謝您的解釋.. – AmirolAhmad

相關問題