2017-07-10 7 views
0

Ich folge diesem tutorial. Das Tutorial erfordert, dass ich die Zerstörungsfunktion für Tags implementiere.Ungültiger Fremdschlüssel beim Löschen von Variablen in Schienen

Die Tags können erstellt und fein angezeigt werden. Doch sie ergibt sich folgende Fehler zu zerstören:

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> 

Gibt es einen Schritt i verpasst oder etwas, was ich falsch eingegeben ?

+0

Können Sie bitte auch Ihr Modell hinzufügen? –

+1

Wenn Ihr Tag Tags hat, müssen Sie zuerst alle Tags löschen. Sie können dies mit 'dependent:: destroy' tun oder sie in der Aktion desktops destroy löschen. – Maxence

Antwort

3

Sie haben eine Fremdschlüsselbeziehung zwischen tag und einer anderen Entität in Ihrer Anwendung. Wenn Sie ein Tag gelöscht haben, werden die Datensätze, die auf diesem Tag basieren, verwaist, sodass die Datenbank die referenzielle Integrität nicht beeinträchtigt.

Sie können diese Beziehung entweder loswerden (in Ihrer Modelldatei haben Sie wahrscheinlich eine has_many-Beziehung angegeben, die Sie entfernen können) oder Sie können eine dependent: :destroy-Klausel angeben, die alle verwandten Datensätze zerstört, wenn Sie das zugehörige Tag löschen. Die erste Option ist weniger als wünschenswert, weil Sie viele Zeilen mit Nullen haben, die Sie später aufräumen müssen. Die zweite Option ist besser, weil Sie die referenzielle Integrität beibehalten (die Beziehung zwischen Tabellen in Ihrer Datenbank).

Zum Beispiel Ihre tag.rb Datei könnte wie folgt aussehen:

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

Auf diese Weise, wenn Sie einen Tag aus der Datenbank löschen, werden alle zugehörigen foos auch zerstört werden, und die Datenbank wird nicht beschweren. Lesen Sie auf AR Vereinigungen here.

Verwandte Themen