2017-07-10 36 views
0

我跟隨此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 

tags_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> 

是否有一步我錯過了什麼我進錯了?

+0

你可以請加你的模型嗎? –

+1

如果您的標籤有標籤,您必須先刪除所有標籤。你可以用'dependent::destroy'來做到這一點,或者在標籤控制器銷燬行爲中刪除它們。 – Maxence

回答

3

您在應用程序中的tag和其他實體之間有外鍵關係。如果您刪除了標籤,那麼依賴該標籤的記錄將變爲孤立,因此數據庫可以防止您破壞引用完整性。

您可以擺脫這種關係(在您的模型文件中,您可能指定了可以移除的has_many關係),也可以指定dependent: :destroy子句,該子句在銷燬關聯標記時銷燬所有相關記錄。第一種選擇不太理想,因爲最終會產生許多帶有空值的行,然後您必須清理它們。第二種選擇更好,因爲您保留了參照完整性(數據庫中表之間的關係)。

例如,您tag.rb文件可能是這個樣子:

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

這樣,當你從數據庫中刪除一個標籤,所有相關的Foo也被破壞了,並且數據庫將不抱怨。閱讀AR協會here