此表格为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_event
为select_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。
:trigger_event, :message & :ptc {:id}
将保存。:trigger_event, :message, :ptc {:id}, :remind_interval & :document {:id}
将保存。如何实现这一目标?
答案 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"
(符号名称的第一个字符)。