Rails 4 - 在一个单一形式和/或中保存JSON对象中的多个值

时间:2016-11-24 06:35:41

标签: ruby-on-rails arrays json ruby ruby-on-rails-4

此表格为tbl_notification。比方说,我想生成类似这样的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中只有两个主要对象(:trigger_event [ONE]& [TWO])。 ONE有3个哈希值,而TWO有5个哈希值。

对于db方面,我使用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' %>

原因是,我想制作AND / OR表格,用户可以查看字段形式ONE或检查字段形式TWO或检查字段形式ONE&amp; TWO。

  1. 因此,如果选中“1”,:trigger_event, :message & :ptc {:id}将保存。
  2. 如果选中TWO,:trigger_event, :message, :ptc {:id}, :remind_interval & :document {:id}将保存。
  3. 如果检查两者(ONE&amp; TWO),将产生类似上面的JSON输出。
  4. 如何实现这一目标?

1 个答案:

答案 0 :(得分: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替换它们。

PPS :trigger_event['ONE']相当于"trigger_event"["ONE"]或者您试图获取索引"ONE"处的符号的其他字词字符串"trigger_event"会导致nil

作为参考,:trigger_event[0]将生成"t" (符号名称的第一个字符)