背景 :(如果你很懒,但仍想帮忙尝试跳转到下面的问题)我有一个与自身有一对多关系的模型节点(即一棵树)。我想有一个页面,用户可以使用整个树。我将使用JSON将树作为javascript对象发送:
tree = <%= raw @node.to_json(:include => :nodes) %>
有一个表单,其中的字段对应于Node的属性(名称,位置,日期等)。我的问题是:构建此表单的最佳方法是什么,以便我可以使用上述所有节点?
我需要某种小部件来选择节点。为简单起见,我们只说一堆<a>
s。
显然,我需要使用javascript来填充所选节点数据的表单。然后如何将javascript附加到<a>
元素以使用JSON数据填充表单?例如,我可以有一个递归的部分_write_node.html.erb:
<a onclick="loadNodeIntoForm("<%=str%>)">node.name</a>
<% for i in 0..node.nodes.size %>
<%= render :partial => 'write_node', locals => { :node => node.nodes[i], :str => str + '.nodes[' + i.to_s + ']' } %>
<% end %>
我打电话使用
<%= render :partial => 'write_node', locals => { :node => @node, :str => 'tree.node' } %>
或许我可以通过遍历<a>
来使用javascript在客户端构建tree
,这样可以避免上面的hackish字符串连接?我在想像
function loadNodeIntoForm(node) {
document.getElementById('node[name]').value = node.name;
document.getElementById('node[date]').value = date.name;
//etc.
}
然后我还将有javascript,它将在编辑表单时更新JSON对象。
问题:最后,如何在不使用表单的情况下使用AJAX保存对象?例如,我希望用户能够在保存之前编辑多个节点,这样我就不能在表单上使用ajax,这只会提交当前编辑的节点。是否可以简单地POST一个json对象?