0

我有一个包含一些使用 jQuery 动态添加的日期字段的表单,为了处理提交的参数,我需要计算这些字段的数量,然后在控制器内部我可以根据该数字进行循环:

应用程序.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”?

我必须将所有日期范围存储在一个数组中,然后根据每个日期创建多个记录。

4

2 回答 2

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 原生的,所以为什么要麻烦和重新发明轮子?

于 2013-03-20T20:33:58.197 回答
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"]
于 2013-03-20T20:00:18.150 回答