"V-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 07:29:24 26 4
gpt4 key购买 nike

我正在关注这个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com