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