Rails - 从javascript事件发出ajax请求并加载部分

时间:2012-07-25 16:51:42

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

怎么了?

我正在使用rails 3.2.3和ruby 1.9.2p290。

我的模型购买有许多purchase_payments:

class Purchase < ActiveRecord::Base
  has_many :purchase_payments, :class_name => 'PurchasePayment', :dependent => :destroy
  accepts_nested_attributes_for :purchase_payments

  def Purchase.build_payments(count)
    #Creat #count payments with some logic for each of them
  end
end

在我的表格中,我有number_field:

<td>
  <%= f.number_field :payments_count, :min => 0 %>
</td>

现在,我想根据付款次数显示purchase_payment字段。为此,我有一个特定的div:

<div id="purchase_payments_space"> </div>

到目前为止我找到的每个资源都讨论了辅助标记生成的ajax,例如link_to ...,:remote =&gt;是的,但是使用此标记,用户必须单击链接才能调用远程函数。在我的应用程序的其他部分,我使用jquery ajax请求,我正在尝试使用这样的方式将请求发送到我的控制器:

function load_payments() {
  $.ajax({
    type: "POST",
    url: "/purchases/build_payments/" + document.getElementById("purchase_payments_count").value,
  });
}

$(document).ready(function() {
  $("#purchase_payments_count").change(load_payments);
}

在我的控制器中,我在我的类声明和以下方法之后有了respond_to:js:

def build_payments
  pc = params[:payments_count].to_i
  @purchase = Purchase.new

  @purchase_payments = Purchase.build_payments pc

  respond_to do |format|
    format.js
  end
end

这样我的app / views / purchases / buid_payments.js.erb运行正常。 问题是,我正在建立一个应该包含在我的表单中的付款集合,并且按照我目前正在做的方式做事并不像rails会这样做。这样我将不得不在js.erb文件中编写很多代码,但我仍然无法弄清楚如何让create方法从params构建完整的购买(我不知道如何从javascript)。

我查看了几种不同的方法,但没有给出一个集成的解决方案,用于从javascript事件发出ajax请求,并让视图为我的嵌套属性创建嵌套字段(我必须记住buy_payment的集合)。

我看到了http://railscasts.com/episodes/196-nested-model-form-part-1http://railscasts.com/episodes/197-nested-model-form-part-2,但是那些构建在辅助方法之上,例如link_to和link_to_function。

任何人都可以指出我如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

$.ajax({
    url: "purchases/build_payments",
    type: 'POST',
    data: $('#purchase_payments_count').val(),
    dataType: 'html',
    headers: {
      'X-CSRF-Token': '<%= form_authenticity_token.to_s %>'
    }
});

然后

def build_payments
  pc = params[:payments_count].to_i
  @purchase = Purchase.new

  @purchase_payments = Purchase.build_payments pc

  respond_to do |f|
    f.js {}
  end
end

将运行buid_payments.js.erb,它可以填充\重新创建你的表

如果看不到,我帮不了你。