控制器内的动态字段参数

时间:2013-03-20 16:22:37

标签: javascript jquery ruby-on-rails

我有一个表单,其中包含一些使用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”?

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

2 个答案:

答案 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"]