对于Rails 4.1.6、Ruby2.3.0、JQuery 1.11.1 (jquery 3.1.1、咖啡-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>如果我运行该代码,它可以正常工作,并且警报显示“成功!”,回调将在呈现部分视图后立即执行。问题是,在发出警报的地方,我想要对新创建的项(如id)的信息做一些处理,但我无法找到一种方法,使我在控制器中创建的项返回回调函数。
由于我使用的是CoffeeScript,所以我的主javascript文件和create.js.erb无法相互通信(无法从另一个文件到达主文件上声明的函数)。
如果我改变我的控制器来做:
respond_to do |format|
format.js
format.json { render json: @item }
end并将按钮上的数据类型更改为"json",我将获得回调上的项,但部分视图将永远无法到达。如果添加这两种数据类型,那么就可以在回调的"data“变量中得到create.js.erb上的所有内容。
解决这个问题的最好办法是什么?
发布于 2018-10-03 14:27:54
如果我正确理解了您的问题,您希望能够在回调中使用@item进行操作。
您应该能够从create.js.erb内部操作@item,而不是使用success回调。
为了测试这一点,我将删除以下内容:
$('#add_item_form').on('ajax:success', function (e, data){ alert('Success!'); }
然后向create.js.erb文件中添加一些Javascript代码:
$('#item_list').append("<%= escape_javascript(render partial: 'item_li', locals: { item: @item }) %>")
alert('Success!');
// Do whatever you want here, @item should be accessible https://stackoverflow.com/questions/52628277
复制相似问题