用于注释的Ajax删除不会重新加载partial + rails 3.2

时间:2013-02-08 05:44:52

标签: ruby-on-rails ajax ruby-on-rails-3.2

我有ajax评论提交和删除,提交工作完美但删除无效。

以下是我的代码: -

控制器

def destroy
  @status_update = StatusUpdate.find(params[:id])
    if @user == current_user
      if @status_update.destroy
        respond_with do |format|
          format.html do
            if request.xhr?
              render :partial => "users/post_status_update", :locals => {:user => @user}, :layout => false, :status => :created
            else
              redirect_to @user
            end
          end
        end
      end
    end
  end

Javascript

$(document).ready(function(){

  $('.delete-status-update')
    .on("ajax:beforeSend", function(evt, xhr, settings){
    })

    .on("ajax:success", function(evt, data, status, xhr){
      $('.status-partial').replaceWith(xhr.responseText);

    })

});

查看

.status-partial
  -@user.status_updates.latest.limit(5).each do |status_update|
    .row-fluid.cycle-status-update{:class => cycle("dark", "light")}
      .row-fluid
        .span11
          = status_update.status
        .span1
          .delete-status-update-link
            %strong= link_to "X", [@user,status_update], :remote => true, :method => :delete, :class => "delete-status-update"
      .row-fluid
        .time-ago-in-words
          ="#{time_ago_in_words(status_update.created_at)} ago"

问题是当我点击删除链接后状态部分没有被替换,刷新页面后ajax delete首次运行然后再次停止工作。

3 个答案:

答案 0 :(得分:1)

你不必要地使一切变得复杂。您的销毁控制器可以很简单,如下所示:

def destroy
  @status_update = StatusUpdate.find(params[:id])
  if @user == current_user
    unless @status_update.destroy
      redirect_to @user
    end
  end
end

在您的观看次数中,请尝试使用导轨link_to "action", action_path, remote: true

,而不是通过$ .ajax调用

将您的html视图文件命名为destroy.js.erb。

这些可以是它的内容:

$('.status-partial').html(<%= @user.generate_new_content.to_s %>);

Rails将负责其余部分。单击链接时,类“status-partial”的元素将其html内容替换为“一些新内容”。

分离HTML和AJAX响应是一种很好的做法,Rails提供了一种方便的方法。使用它。

答案 1 :(得分:0)

我认为如果你愿意的话会更好

respond_with do |format|
format.js

然后有一个名为destroy.js.erb的文件来放置删除后应该触发的javascript

答案 2 :(得分:0)

问题在于javascript文件中使用的.on语法,它不像.live那样有用。将语法更改为

$(document).ready(function(){

  $(document).on("ajax:success", "#create_status_update_form", function(evt, data, status, xhr){
      $('.status-partial').replaceWith(xhr.responseText);
      $('.comment-text').val('');
    })

});

解决了这个问题。