我刚刚在学校项目中加入了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
答案 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 %> | ...