【问题标题】:Rails Delete doesn't destroy record, simply refreshesRails Delete 不会破坏记录,只是刷新
【发布时间】:2020-10-12 19:35:48
【问题描述】:

我的销毁/删除链接只是刷新了帖子页面,并没有真正删除记录。

<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.errors.full_messages的输出吗?确保在您尝试销毁它之后查看错误
  • 我认为没有调用destroy。日志未记录删除尝试

标签: ruby-on-rails destroy


【解决方案1】:

解决方案是使用button_to 而不是link_to

这揭示了额外的错误,需要我在 Post 模型中的 has_many :through 关联上方/之前定义 has_many 关联。

不确定为什么link_to 在这种情况下不起作用。

【讨论】:

  • 这是一个非常奇怪的行为。更改为 button_to 后,我遇到了同样的问题,就像一个魅力一样。
【解决方案2】:

你没有检查@post.destroy是否成功,它返回真或假。

最简单的做法是使用@post.destroy!,如果失败将抛出异常。一般来说,使用 !确保您不会错过任何错误的版本:create!destroy!save!update!

我的猜测是@post 具有引用帖子的关联对象。这些必须在 Post 被删除之前被删除。您可以通过在其关系中添加 dependent: :destroy 来解决此问题。

class Comment
  belongs_to :post
end

class Post
  has_many :comments, dependent: :destroy
end

【讨论】:

  • 帖子确实有关联的模型
【解决方案3】:

如果您的页面正在刷新并且没有根据控制器操作执行重定向,则该页面可能没有设置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 %>

现在,如果帖子删除失败,您可以显示一条消息,说明失败的原因(或者您可以查看日志中的 ==&gt; Post failed to delete: ... 行)。

【讨论】:

  • 不知道为什么,但这并没有显示任何闪存消息。我得到相同的结果(刷新页面)
  • 这很可能是因为您尚未设置布局以在视图中呈现 Flash 消息。你能看到日志说什么吗?如果帖子没有被删除,您应该会在日志中的某处看到 ==&gt; Post failed to delete 的一行。
  • 日志没有提到删除。它只显示构建页面的获取。
  • 我添加了一个用于在您的视图中显示 Flash 消息的 sn-p,尝试将其添加到您的视图文件中,然后再试一次。如果帖子删除失败,您应该会在视图的该部分看到呈现的内容。
  • 什么都没有出现。我不认为destroy 正在运行?日志没有显示任何删除尝试,也没有闪烁消息。虽然我的控制器和视图与上面的完全一样。
猜你喜欢
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多