通过ajax调用渲染rails fields_for

时间:2016-02-16 21:23:49

标签: javascript ruby-on-rails ajax ruby-on-rails-4 simple-form

我有一个AJAX电话:

$('#enrollment_members').change(function(){
var memberNumber = $(this);
$.ajax({type: 'GET',
      url: $(this).href,
      type: "get",
      data: { members: memberNumber.val() },
      error: function(){ alert("There was a problem, please try again.") }
      });
return false;

console.log(data);
});

我通过它将params [:members]发送到一个新方法。

我想做这样的事情:

def new
  @enrollment = Enrollment.new
  params[:members] ? params[:members].to_i.times { @enrollment.atendees.build } : @enrollment.atendees.build

  respond_to do |format|
    format.js
  end
end

我需要此值才能知道要构建多少fields_for

但是在新操作中,如何在members输入字段中输入值后更新新视图的内容?

从那个三元组中,@ enrollment.atendees包含4个对象。

我的new.js.erb

$("#contact-wrap").html("<%= j render(:partial => 'enrollments/form') %>");

xhr响应包含4个fields_for表单。

3 个答案:

答案 0 :(得分:0)

对象#enrollment_members是否是您尝试传递给控制器​​的输入值?

如果是这样,试试这个:

$('#enrollment_members').change(function(){
  var memberNumber = $(this);
  $.ajax({type: 'GET',
    url: $(this).href,
    type: "get",
    data: { members: memberNumber.serialize() }, //CHANGE
    error: function(){ 
      alert("There was a problem, please try again.") 
    }
});
return false;

答案 1 :(得分:0)

嗯,你真的确定你需要一个定制的解决方案吗?在fields_for中动态添加/删除子项的行为已经受到nested_form(不再维护)或cocoon(更有希望)等几个宝石的支持

即使您需要按照自己的方式进行调整,我也建议您重新使用它们的库。因为做一个AJAX请求是完全没有意义的。你的AJAX是一个GET请求,总是做同样的事情,除非你有一个自定义的atendees.build,它会为连续的调用做一些奇怪的事情(比如在某个地方增加一个全局计数器)。

我上面提到的那些宝石实际上会保存HTML字段以在&#34;模板中生成&#34; (在本地存储在HTML或JS中),只要在想要添加新字段时调用此模板。

答案 2 :(得分:0)

我通过修改ajax调用来实现它:

$('#enrollment_members').change(function(){
var memberNumber = $(this);
$.ajax({type: 'GET',
      url: $(this).href,
      type: "get",
      dataType : "html",
      data: { members: memberNumber.val() },
        success: function( data ) {
          var result = $('<div />').append(data).find('#contact-wrap').html();
          $('#contact-wrap').html(result);
          $('#atendees-wrap').show();
        },
        error: function( xhr, status ) {
          alert( "Sorry, there was a problem!" );
        }
      });
return false;

});