【发布时间】:2018-05-28 20:23:36
【问题描述】:
Rails:5.2.0,Ruby:2.4.1p111,浏览器:Chrome 66.0.3359.181,jquery-rails gem:4.3.3,Turbolinks 已禁用。
我正在关注这个AJAX on Rails with Unobtrusive JS 教程并且已经结束,但是有一些我无法弄清楚的奇怪行为。
应用程序使用 UJS 允许用户通过 AJAX 将新记录添加到列表底部,而无需像 Rails 通常那样更新整个页面。添加新记录工作正常,但是当我点击“删除”时,application.js 中的 JS 函数没有被触发,所以似乎什么都没有发生,但是当我刷新页面时,记录消失了。如果我添加一条新记录,刷新页面然后尝试删除记录 JS 被触发并立即从列表中删除/删除记录。
网页很简单:
<!–– index.html.erb ––>
<h1>Tutorials</h1>
<ul id=tutorials>
<%= render @tutorials %>
</ul>
<%= form_with model: Tutorial.new, data: {'js-tutorial-form' => true} do |form| %>
Title <%= form.text_field :title %><br>
URL <%= form.text_field :url %><br>
<%= form.submit %>
<% end %>
有一小部分:
<!–– _tutorial.html.erb ––>
<li data-js-tutorial-id=<%= tutorial.id %>>
<%= tutorial.title %> <%= link_to "Delete", tutorial, remote: true, method: :delete %>
</li>
所有的 JS 都在 application.js 文件中
$(document).ready(function() {
$('[data-js-tutorial-form]').on("ajax:success", function(event, data, status, xhr){
var tutorial = $(xhr.responseText).hide();
$('#tutorials').append(tutorial);
tutorial.fadeIn(2000);
});
$('[data-js-tutorial-id]').on("ajax:success", function(event, data, status, xhr){
var tutorial_id = xhr.responseJSON.id;
$('[data-js-tutorial-id=' + tutorial_id + ']').hide();
});
});
唯一的其他文件是控制器
class TutorialsController < ApplicationController
def index
@tutorials = Tutorial.all
end
def create
@tutorial = Tutorial.new(params[:tutorial].permit(:title, :url))
if @tutorial.save
render partial: "tutorial", locals: {tutorial: @tutorial}
end
end
def destroy
@tutorial = Tutorial.find(params[:id])
@tutorial.destroy
render json: @tutorial
end
end
我没有得到的是 HTML 源代码在页面刷新之前和之后是相同的,但我已经使用 Chrome 开发人员工具确认 $('[data-js-tutorial-id]') 是除非页面被刷新,否则不会被调用。我在控制器中使用了 byebug 来确认是否正确执行。有什么想法吗?
【问题讨论】:
标签: jquery ruby-on-rails ajax ujs