ruby-on-rails - 删除rails中的标签时外键无效

标签 ruby-on-rails

我正在关注这个 tutorial .教程要求我实现标签的销毁功能。

可以创建并正常显示标签。但是,销毁它们会产生以下错误:

 Parameters: {"authenticity_token"=>"VcYU8FRqn4oBXCv0NKXuO7yKNdI+9fIk46rY1ZwD7cQ8cqi37nZDVwNnWJLcNMWVq4gi3OU3YFDgzdeTRa1XKw==",
 "id"=>"1"}
  Tag Load (0.5ms)  SELECT  "tags".* FROM "tags" WHERE "tags"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
   (0.0ms)  begin transaction
  SQL (2.0ms)  DELETE FROM "tags" WHERE "tags"."id" = ?  [["id", 1]]
   (1.0ms)  rollback transaction
Completed 500 Internal Server Error in 10ms (ActiveRecord: 3.5ms)



ActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed: DELETE FROM "tags" WHERE "tags"."i
d" = ?):

app/controllers/tags_controller.rb:13:in `destroy

标签 Controller .rb
class TagsController < ApplicationController

    def index
        @tags = Tag.all
    end

    def show
        @tag = Tag.find(params[:id])
    end

    def destroy
        @tags = Tag.find(params[:id])
        @tags.destroy
        # Set variable to instance of an object of class Article and call .destroy on it.
    end
end

index.html.erb
<h1>Listing tags</h1>

  <% @tags.each do |tag| %>
    <tr>
      <td><%= tag.name %></td>
      <td><%= link_to 'Show', tag_path(tag) %></td>
      <td><%= link_to 'Delete', tag_path(tag),
              method: :delete,
              data: { confirm: 'Are you sure?' } %></td>
    </tr>
  <% end %>
</table>

是否有我遗漏的步骤或我输入的错误?

最佳答案

您在 tag 之间有外键关系以及您的应用程序中的其他一些实体。如果您删除了一个标签,依赖于该标签的记录将成为孤立的,因此数据库会阻止您破坏参照完整性。

您可以删除该关系(在您的模型文件中,您可能指定了一个可以删除的 has_many 关系),或者您可以指定一个 dependent: :destroy当您销毁相关标记时,该子句会销毁所有相关记录。第一个选项不太理想,因为您最终会得到很多带有空值的行,然后您必须稍后清理这些行。第二个选项更好,因为您保留了参照完整性(数据库中表之间的关系)。

例如,您的 tag.rb 文件可能如下所示:

class Tag < ApplicationRecord
  has_many :foos, dependent: :destroy
end

这样,当你从数据库中删除一个标签时,所有关联的 foo 也会被销毁,数据库不会提示。阅读 AR 协会 here .

关于ruby-on-rails - 删除rails中的标签时外键无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45007420/

相关文章:

ruby-on-rails - 未从 css 文件 Heroku 和 S3 引用 Rails 4 供应商 Assets 图像

ruby-on-rails - 对多条路线使用同一个 Controller ?

ruby-on-rails - Webpacker 需要 Node.js >= v6.4 并且您正在使用 v5.4.0

ruby-on-rails - 获取带有空格分隔符的字符串列表的最有效方法

ruby-on-rails - Rails 4 'permit' 和 'count by one' 错误

ruby-on-rails - rails : Translation in Initializer

ruby-on-rails - 在 ruby​​ on Rails 中读取 webcal URL

ruby-on-rails - 查找两个条件都为真的所有记录

ruby-on-rails - 为删除的迁移生成 Rails 模型

ruby-on-rails - 热门显示用户的youtube视频吗?