【发布时间】:2019-03-08 18:10:21
【问题描述】:
我在 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>
如果我运行该代码,它可以正常工作,并且警报显示“成功!”,回调会在部分视图呈现后立即执行。问题是,该警报在哪里,我想用新创建的项目的信息(如 id)做一些事情,但我找不到让我在控制器中创建的项目回到回调函数。
由于我使用的是 CoffeeScript,因此我的主 javascript 文件和 create.js.erb 无法相互通信(无法从其他文件访问主文件上声明的函数)。
如果我将控制器更改为:
respond_to do |format|
format.js
format.json { render json: @item }
end
并将按钮上的数据类型更改为“json”,我将在回调中获取项目,但永远无法到达部分视图。如果我添加这两种数据类型,那么我会在回调的“数据”变量中获得 create.js.erb 上的任何内容。
这个问题的最佳解决方案是什么?
【问题讨论】:
标签: javascript jquery ruby-on-rails ruby ruby-on-rails-4