0

我在我的 rails 应用程序中与dailyposts 和评论有一个多态关联

数据库中一切正常,但是当我尝试将 Ajax 添加到 Destroy Action 时(我使用了本教程http://railscasts.com/episodes/136-jquery-ajax-revised)......它不起作用除非我刷新页面。(但我的警报在 destroy.js.erb 中有效)

我知道我的错误在 destroy.js.erb

Rails 新手...请帮助:)

这是我的代码...

路线

resources :dailyposts do
  resources :comments
end

控制器

##Dailyposts

class DailypostsController < ApplicationController

  respond_to :html, :js

  def show
    @user = User.find_by_username(params[:username])
    @dailypost = Dailypost.find_by_id(params[:id])
    @commentable = @dailypost
    @comments = @commentable.comments.arrange(:order => :created_at)
    @comment = Comment.new
  end
end

##Comments

class CommentsController < ApplicationController
  before_filter :load_commentable

  respond_to :html, :js

  def create
    @comment = @commentable.comments.create(params[:comment])
    @comment.user = current_user
    if @comment.save
      respond_to do |format|
        format.html { redirect_to @commentable }
        format.js
      end
    else
      redirect_to @commentable, notice: "Comment can't be blank."
    end
  end

  def destroy
    @comment = Comment.find(params[:id])
    @commentable = @comment.commentable
    if @comment.destroy
      respond_to do |format|
        format.html { redirect_to @commentable }
        format.js
      end
    end
  end

  private 

  def load_commentable
    resource, id = request.path.split('/')[1, 2]
    @commentable = resource.singularize.classify.constantize.find(id)
  end

end

意见

Dailypost show.html.erb

  <div class="row-fluid">
    <div class="span12">

      <div>
        <%= raw(dailypost_with_links(@dailypost)) %>
      </div>

      <%= render "comments/form" %>

      <div id="comments">         
        <%= nested_comments @comments %>
      </div>

    </div>

  </div>

_comment.html.erb

<section class="comments">
  <div class ="user">
    <%= link_to comment.user.username, comment.user  %> 
    <%= comment.content %>
  </div>

##Here I am passing remote: true for ajax

    <% if current_user?(comment.user) %> 
      <%= link_to content_tag(:i, "", class: "icon-trash icons"), [@commentable, comment], method: :delete,
                       data: { confirm: "Are you sure?" },
                       title: "Delete", remote: true %> |
    <% end %>

</section>

销毁.js.erb

##alert is working
alert('ajax works!');

$('#<%= dom_id(@comment) %>').remove();

日志

Started DELETE "/dailyposts/11/comments/133" for 127.0.0.1 at 2013-08-04 23:06:31 -0700
Processing by CommentsController#destroy as JS
  Parameters: {"dailypost_id"=>"11", "id"=>"133"}
  Dailypost Load (0.3ms)  SELECT "dailyposts".* FROM "dailyposts" WHERE "dailyposts"."id" = ? ORDER BY dailyposts.created_at DESC LIMIT 1  [["id", "11"]]
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'sgFH2XeZWEXCcjxiAwgfXg' LIMIT 1
  Comment Load (0.2ms)  SELECT "comments".* FROM "comments" WHERE "comments"."id" = ? LIMIT 1  [["id", "133"]]
  Dailypost Load (0.1ms)  SELECT "dailyposts".* FROM "dailyposts" WHERE "dailyposts"."id" = 11 ORDER BY dailyposts.created_at DESC LIMIT 1
   (0.1ms)  begin transaction
  Comment Load (0.1ms)  SELECT "comments".* FROM "comments" WHERE (comments.ancestry like '133/%' or comments.ancestry = '133')
  SQL (0.4ms)  DELETE FROM "comments" WHERE "comments"."id" = ?  [["id", 133]]
   (2.3ms)  commit transaction
  Rendered comments/destroy.js.erb (0.7ms)
Completed 200 OK in 25ms (Views: 10.3ms | ActiveRecord: 3.9ms)
4

3 回答 3

1

重定向正在破坏响应。尝试将其更改为redirect_to( :back ) unless request.xhr?

于 2013-08-05T00:50:50.110 回答
1

试试这个:

Dailypost show.html.erb

 <div id="comments">
   <%= render @comments %>
 </div>

_comment.html.erb

 <div id="<%= dom_id(comment) %>"> 
   <%= comment.content %>
 </div>

创建.js.erb

 $('<%= escape_javascript(render(:partial => @comment))%>').appendTo('#comments').hide().fadeIn();

销毁.js.erb

 $('#<%= dom_id(@comment) %>').remove();
于 2013-08-05T12:24:28.440 回答
0

问题出在destroy.js.erb,第二行不起作用,因为没有像edit_comment_1这样的id,格式为edit_comment_(:id)。

在您的_comment.html.erb中,添加一个适当的 div,其 id 用于您的.js.erb

<section class="comment">

 <div id="edit_comment_<%= comment.id %>">

  <div class ="user">
     <%= link_to comment.user.username, comment.user  %> 
     <%= comment.content %>
   </div>

    <% if current_user?(comment.user) %> 
      <%= link_to content_tag(:i, "", class: "icon-trash icons"), [@commentable, comment], method: :delete,
                       data: { confirm: "Are you sure?" },
                       title: "Delete", remote: true %> |
    <% end %>

 </div>
</section>
于 2013-08-05T10:48:11.747 回答