且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Ajax和多态协会(销毁和放大器;创建)

更新时间:2023-01-23 19:12:58

试试这个:

Dailypost show.html.erb

 < D​​IV ID =意见>
   &其中;%=渲染@comments%GT;
 < / DIV>
 

_comment.html.erb

 < D​​IV ID =<%= dom_id(评论)%>>
   &其中;%= comment.content%GT;
 < / DIV>
 

create.js.erb

  $('<%= escape_javascript(渲染(:部分=> @comment))%>')。appendTo('#评论)隐藏()。淡入();
 

destroy.js.erb

  $('#<%= dom_id(@comment)%>')删除()。
 

I have a polymorphic association with dailyposts & comments in my rails app

Everything works fine in the database, but when I try to add Ajax to the Destroy Action (I used this tutorial http://railscasts.com/episodes/136-jquery-ajax-revised) ....it doesn't work unless I refresh the page. (but my alert works in destroy.js.erb)

I know my error is in destroy.js.erb

New to Rails...Please help :)

This is my code...

ROUTES

resources :dailyposts do
  resources :comments
end

CONTROLLERS

##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

VIEWS

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>

destroy.js.erb

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

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

LOGS

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)

Try this:

Dailypost show.html.erb

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

_comment.html.erb

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

create.js.erb

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

destroy.js.erb

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