Rails Delete不会破坏记录,只是刷新

问题描述

我的销毁/删除链接只是刷新帖子页面,而实际上并没有删除记录。

<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在这种情况下不起作用。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...