为什么我的Rails AJAX删除方法只有在刷新时才有效?

时间:2015-06-10 23:24:40

标签: javascript jquery ruby-on-rails ruby ajax

我刚刚在学校项目中加入了DESTROY方法。它工作正常,但现在我必须使用AJAX来完成操作。实现此代码后,它仅在我刷新页面时显示在浏览器上,而不是在我删除项目时立即显示。如果我没有提供足够的信息,请告诉我。

_item.html.erb

<% item.each do |i| %>
  <p><%= i.name %> | <%= link_to "Complete", i, method: :delete, remote: true, class: 'glyphicon glyphicon-ok' %></p>
<% end %>

destroy.js.erb

<% if @item.destroyed? %>
  $('#item-' +<%= @item.id %>).hide();
<% else %>
  $('#item-' +<%= @item.id %>).prepend("<%= flash[:error] %>");
<% end %>

items_controller.rb

class ItemsController < ApplicationController
  def index
    @items = Item.all
  end

  def show
    @item = Item.find(params[:id])
  end

  def new
    @item = Item.new
  end

  def edit
    @item = Item.find(params[:id])
  end

  def create
    @item = Item.new(params.require(:item).permit(:name))

    if @item.save
      flash[:notice] = "The item was added to your list."
      redirect_to current_user
    else
      flash[:error] = "There was a problem creating your item."
      redirect_to current_user
    end
  end

  def destroy
    @item = Item.find(params[:id])

    if @item.destroy
      flash[:notice] = "\"#{@item.name}\" was completed and destroyed."
    else
      flash[:error] = "There was an error completing the item."
    end

    respond_to do |format|
      format.html
      format.js
    end

  end

end

1 个答案:

答案 0 :(得分:4)

Flash为下一个请求设置消息,这就是它在您的创建操作中正常工作的原因(因为您正在重定向)。在你的销毁动作中,你正在渲染(这不好,因为它意味着删除请求在页面刷新时重新发送,你应该在这里重定向)和设置flash,所以它会显示在下一个请求(刷新)上。如果要为当前请求发送响应消息,则必须使用flash.now

flash.now[:notice] = "\"#{@item.name}\" was ..."

同样,你应该在成功时使用flash和redirect,并使用flash.now并在请求失败时呈现。

修改

以上段落仅适用于html请求。我最初错过了问题的重点! 感谢BroiSatse

查看您的显示代码,您似乎没有设置"#item-@item.id",因此您的返回js什么都不做。像这样添加:

<p id="item-<%= i.id %>"><%= i.name %> | ...