这工作正常:
class CommentsController < ApplicationController
def destroy
respond_to do |format|
format.js { render "destory.js.erb" }
end
end
end
这根本不起作用(JavaScript 永远不会触发(:
class CommentsController < ApplicationController
def destroy
respond_to do |format|
format.js
end
end
end
这是意料之中的吗?
我认为 Rails 应该自动知道使用/comments/destroy.js.erb
视图?我是否总是必须显式定义 JavaScript 视图?
多亏了@tadman,我最终从完全不同的角度处理了这个问题,我的问题现在已经解决了。
正如这本出色的发动机堆场教程中所解释的那样,我完全放弃了respond_to
和format.js
的方法。我现在转而使用显然是 Rails 核心团队更喜欢的 AJAX 方法——即:
我的观点:
<p data-js-comment-id=<%= c.id %> class="blank_links" style="margin-top:-12px;">
<%= c.body %>
<%= link_to blog_post_comment_path(@blog_post,c), remote: true, method: :delete,
data: { confirm: "Are you sure?" } do %>
<%= fa_icon "trash" %>
<% end %>
</p>
我的控制器:
class CommentsController < ApplicationController
def destroy
@blog_post = BlogPost.find(params[:blog_post_id])
@comment = Comment.find(params[:id])
@comment.delete
render json: @comment
end
end
我的/app/assets/javascripts/blog_posts.js
文件(我从最初/app/assets/javascripts/blog_posts.coffee
重命名,因为我不使用CoffeeScript(:
$(document).on('turbolinks:load', function() {
$("[data-js-comment-id]").on("ajax:success", function(event, data, status, xhr){
var comment_id = xhr.responseJSON.id;
$( "#comment-" + comment_id ).fadeOut(650);
get_default_success_toastr("Comment deleted!", "And just like that, pffft. It's gone!");
});
});
请注意$(document).on('turbolinks:load', function() {
行上方。正如这里和这里所指出的,这非常重要。
最后,我的application.js
文件:
//= require jquery
//= require jquery_ujs
//= require turbolinks
//= require activestorage
//= require_tree .
//= require popper
//= require bootstrap-sprockets
//= require toastr
我之所以包含上面的application.js
文件,是因为:(a( 您需要库的顺序似乎有所不同,以及 (b( 注意到我删除了rails-ujs
效果完美!