格式.js仅当我*硬编码*JS视图时才有效



这工作正常:

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_toformat.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

效果完美!

最新更新