数据类型JS的Rails 4远程请求回调问题

时间:2018-10-03 13:35:20

标签: javascript jquery ruby-on-rails ruby ruby-on-rails-4

我在Rails 4.1.6,Ruby 2.3.0,JQuery 1.11.1(jquery-rails 3.1.1,coffee-rails 4.0.1)上遇到问题,我将举一个简单的示例来说明我的问题:

我有一个视图,其中列出了使用Ajax创建的项目。上面有一个按钮,可以远程创建一个新的空项目:

button_to "Add Item",
          { action: :create },
          form: { id: "add_item_form" },
          remote: true

在我的Javascript上,我已经关联了该事件:

$('#add_item_form').on('ajax:success', function (e, data){
  alert('Success!');
}

控制器:

def create
  @item = Item.new()
  @item.save!
  respond_to do |format|
    format.js
  end
end

由于 create 方法仅响应JS,因此它将尝试渲染具有相同名称的JS视图,这很好:

create.js.erb

$('#item_list').append("<%= escape_javascript(render partial: 'item_li', locals: { item: @item }) %>")

在部分内容上:

_item_li.html.erb

<li>
  <%= form_for(item, remote: true) do |f| %>
    // List of item fields from model
  <% end %>
</li>

如果我运行该代码,它可以正常工作,并且警报显示“成功!”,则在呈现部分视图后立即执行回调。问题是,该警报位于何处,我想对新创建的Item的信息(例如id)做一些事情,但是我找不到一种方法来将我在控制器中创建的Item取回。回调函数。

由于我正在使用CoffeeScript,所以我的主要javascript文件和create.js.erb无法相互通信(无法从其他文件访问在主文件上声明的功能)。

如果我将控制器更改为:

respond_to do |format|
  format.js
  format.json { render json: @item }
end

并将按钮上的数据类型更改为“ json”,我将在回调中获得该项目,但将永远无法到达部分视图。如果我同时添加了两种数据类型,则可以在回调的“数据”变量中获得 create.js.erb 上的所有内容。

此问题的最佳解决方案是什么?

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,则希望能够使用回调中的@item进行操作。

您应该能够从create.js.erb内部操纵@item,而不是使用success回调。

要对此进行测试,我将其删除:

$('#add_item_form').on('ajax:success', function (e, data){ alert('Success!'); }

,然后将一些Javascript代码添加到您的create.js.erb文件中:

$('#item_list').append("<%= escape_javascript(render partial: 'item_li', locals: { item: @item }) %>")
alert('Success!');
// Do whatever you want here, @item should be accessible