没有页面重新加载的警报Rails AJAX

时间:2016-05-01 00:28:13

标签: ruby-on-rails ajax

我有一个模型Snippit,我希望用户能够从列表中删除一个snippit,然后显示一条警告说它已被删除,所有这些都使用了ajax。我已经想出了如何进行实际删除,但没有预警。

以下是代码:

snippits_controller.rb

  def destroy
    @snippit = Snippit.find(params[:id])
    @snippit.destroy
    respond_to do |format|
      format.html { redirect_to snippits_url}
      format.json { head :no_content }
      format.js {render :alert => "Sippit destroyed. "}
    end
  end

destroy.js.erb

$('#snippit_<%= @snippit.id %>').remove();

index.html.erb

<% @snippits.each do |snippit| %>
      <span class="panel panel-default" id="snippit_<%= snippit.id %>">
      <%= link_to edit_snippit_path(snippit), :class => "text" do %>
      <div class="panel-body">
        <h3 class="text"><%=snippit.title%></h3>
          <p class="trash"><%= link_to snippit, method: :delete, remote: true do %>
            <i class="fa fa-2x fa-trash-o"></i>
          <% end %></p>
          </div>
          <% end %>
          </span>
    <% end %>

非常感谢任何和所有帮助:)

1 个答案:

答案 0 :(得分:2)

如果您想要JS警报响应,那么您需要类似以下内容的

format.js {render js: "alert('Sippit destroyed.');"}

上面的format.js渲染意味着你正在呈现一个JS响应。您的警报render :alert => "Sippit destroyed. "仅适用于HTML响应,因为flash[:alert]在HTML页面中呈现,但由于您正在呈现JS响应,因此您要么执行上面的JS警报实现,要么部分更新用于通过以下内容更新Flash消息的HTML页面

destroy.js.erb

$('#snippit_<%= @snippit.id %>').remove();
$('#flash_container').html('<%= j render partial: "flash_container" %>');

UPDATE(为方法2添加工作控制器代码:使用上面的destroy.js.erb)

def destroy
  @snippit = Snippit.find(params[:id])
  @snippit.destroy
  respond_to do |format|
    format.html { redirect_to snippits_url}
    format.json { head :no_content }
    format.js { flash.now[:alert] = @snippit.destroyed? ? 'Sippit destroyed.' : @snippit.errors.full_messages }
  end
end

我为format.js添加了上面的失败处理程序代码。如果@snippit被成功销毁,它会将闪存警报消息设置为'Sippit destroyed',如果@snippit未被销毁,则将其设置为'Some failure to destroy error'。