【问题标题】:Ajax delete for comment is not reloading the partial + rails 3.2用于评论的 Ajax 删除未重新加载部分 + rails 3.2
【发布时间】:2013-02-08 05:44:51
【问题描述】:

我有 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 删除第一次工作后,它再次停止工作。

【问题讨论】:

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


    【解决方案1】:

    您不必要地使一切复杂化。你的销毁控制器可以简单如下:

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

    在您看来,不要通过 $.ajax 调用,而是尝试使用 rails link_to "action", action_path, remote: true

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

    这些可以是它的内容:

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

    Rails 将负责其余的工作。当您单击该链接时,具有“status-partial”类的元素将其 html 内容替换为“一些新内容”。

    将 HTML 和 AJAX 响应分开是一种很好的做法,Rails 提供了一种方便的方法来做到这一点。使用它。

    【讨论】:

      【解决方案2】:

      如果你愿意,我觉得会更好

      respond_with do |format|
      format.js
      

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

      【讨论】:

      • destroy.js.erb 应该在 cmets 视图中?
      【解决方案3】:

      问题在于 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('');
          })
      
      });
      

      解决了问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-07-31
        • 2017-11-24
        • 2020-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多