我有一个表单,其中包含一些使用jQuery动态添加的日期字段,为了处理他们提交的参数,我需要计算这些字段的数量,然后在控制器内我可以根据该数字进行循环:
的application.js
$(function() {
var scntDiv = $('#foo');
var i = $('#foo div.bar').size();
$(document).on('click', '#addField', function() {
$('<div class="bar"><input type="text" id="start" name="start_'+ i +'"><input type="text" id="end" name="end_'+ i +'"></div>').appendTo(scntDiv);
i++;
return false;
});
说我添加了n输入,然后html输出将是:
<input type="text" id="start" name="start_1">
<input type="text" id="end" name="end_1">
.
.
.
<input type="text" id="start" name="start_n">
<input type="text" id="end" name="end_n">
我的问题是,如何在我的控制器中访问“n”?
我必须将所有日期范围存储在一个数组中,然后根据每个日期创建多个记录。
答案 0 :(得分:2)
另一个选项,接近nested_attributes
的实现方式(不是你会看到的最美丽的javascript,但是你得到了精神):
$(function() {
var $scntDiv = $('#foo');
$('#addField').click( function(){
var index = $scntDiv.find( '.bar' ).size();
$(
'<div class="bar">' +
'<input type="text" class="start" name="ranges[' + index + '][start]">' +
'<input type="text" class="end" name="ranges[' + index + '][end]">' +
'</div>'
).appendTo( $scntDiv );
return false;
});
});
这将构建一个这样的哈希:
>> params[:ranges]
=> {"0" => {"start" => "a_date_string", "end" => "another_date_string"},
"1" => {"start" => "a_date_string", "end" => "another_date_string"} }
即使使用质量赋值,也可以轻松处理此哈希:
class MyClass
def ranges= ranges
ranges.each do |*,attributes|
# whatever logic pleases you, self.ranges.build( attributes ) for instance
end
end
end
但是,如果你这样做,最好直接使用nested_attributes,除非你有一个非常复杂的逻辑来执行。嵌套属性带有许多好处,例如子记录的自动实例化,记录删除管理,如果需要自动拒绝某些属性,它们与fields_for
表单助手一起使用,等等。它原生于rails,所以为什么打扰并重新发明轮子?
答案 1 :(得分:0)
这会有所帮助。
$(function() {
var scntDiv = $('#foo');
$('#addField').click(function(){
$('<div class="bar"><input type="text" id="start" name="start[]"><input type="text" id="end" name="end[]"></div>').appendTo(scntDiv);
return false;
});
});
这将发送如下所示的参数。例如
"start"=>["1", "2", "3"], "end"=>["11", "22", "33"]