我在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 上的所有内容。
此问题的最佳解决方案是什么?
答案 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