问题描述
我的销毁/删除链接只是刷新帖子页面,而实际上并没有删除记录。
<span class="delete-button"><%= link_to 'Delete',post_path(@post),method: :delete,data: { confirm: 'Are you sure?' } %>
</span>
控制器
def destroy
@post= Post.find(params[:id])
@post.destroy
redirect_to posts_path
end
解决方法
您无法检查@post.destroy
是否成功,它返回true还是false。
最简单的方法是使用@post.destroy!
,如果失败,它将抛出异常。通常,使用!确保您不会遗漏任何错误的版本:create!
,destroy!
,save!
和update!
。
我的猜测是@post
具有关联的对象,这些对象引用了Post。必须先删除这些,然后才能删除Post。您可以通过在其关系中添加dependent: :destroy
来解决此问题。
class Comment
belongs_to :post
end
class Post
has_many :comments,dependent: :destroy
end
,
如果您的页面正在刷新,并且未按照控制器操作执行重定向,则该页面可能未设置rails-ujs。没有它,您将无法通过超链接发出非GET请求,因此该链接将直接转到帖子的show
页。
如果记录确实无法删除,则可能是由于多种原因。缩小帖子删除失败原因的一种方法是挽救destroy!
引发的异常并记录或显示帖子的错误:
def destroy
post = Post.find(params[:id])
post.destroy!
redirect_to posts_path,notice: "Post deleted successfully"
rescue ActiveRecord::RecordNotDestroyed => e
failure_message = "Post failed to delete: #{e.record.errors.full_messages}"
Rails.logger.warn "==> #{failure_message}"
redirect_to posts_path,alert: failure_message
end
如果您没有为视图设置Flash消息,则可以将其放置在视图文件中:
<% flash.each do |_type,message| %>
<div><%= message %></div>
<% end %>
现在,如果帖子无法删除,您可以显示一条简短的消息,说明失败的原因(或者您可以在日志中查看==> Post failed to delete: ...
行)。
解决方案是使用button_to
代替link_to
这揭示了额外的错误,需要我在Post模型中的has_many
关联上方/之前定义has_many :through
关联。
不确定为什么link_to
在这种情况下不起作用。