0

Ich habe eine Konten Tabelle mit Nicht-Null-Einschränkung für den Namen und die Nummer Spalte. Ich habe auch dieses Stück Code für Controller "Konten" in Aktion zu erstellen:Rails "NOT NULL Constraint fehlgeschlagen: Tabelle.Spalte"

def create 
    account_number = rand.to_s[2..9] 
    @account = Account.new(user_id: current_user.id, name: 'hello', number: account_number) 

    respond_to do |format| 
     if @account.save 
      format.html { redirect_to @account, notice: "Account was successfully created.\n Your account number is: #{account_number}" } 

und mein "Account" Modell ist sehr einfach:

class Account < ApplicationRecord 
    belongs_to :user 

    attr_accessor :name 
    attr_accessor :number 
    attr_accessor :amount 
end 

Aber wenn ich gehe zu/Konten/new und senden, es gibt mir diesen Fehler:

NOT NULL constraint failed: accounts.name

Aber warum? weil ich das "name" -Attribut mit "hallo" im Konstruktor hart kodierte, also warum es "Namen" Spalte mit "hallo" nicht füllt?

+0

können Sie bitte das Tabellenschema –

+0

meine letzte Migration war Post falsch Ende Ende was auch den Typ von "Name" von String zu Dezimal ruiniert –

Antwort

1

Entfernen Sie die attr_accessor Anrufe von Account. Sie überschreiben wahrscheinlich die integrierten Methoden, die aus Ihrem Schema generiert werden, was zu einer Reihe von Problemen führen kann.

Haben Sie eine Migration erstellt und ausgeführt, um diese Attribute zur Tabelle accounts hinzuzufügen?

+0

ja ich tat, du hattest Recht. Ich habe nur attr_accessors entfernt und das Problem ist gelöst. Danke :) –

0

Wenn Sie :user_id haben, :name, :number und :amount Felder, die Sie brauchen nicht attr_accessor für sie hinzuzufügen.

Sie können auch die Validierung auf Modellebene unter :name hinzufügen, um den Fehler database-level zu vermeiden. Klasse AddAccountsNotNullConstraint

class Account < ApplicationRecord 
    belongs_to :user 

    validates :name, presence: true 
end 
+0

Aber führt das nicht zu einem Fehler? Ich meine, was ist der genaue Vorteil dieser Vermeidung? –

+0

Dies gibt Ihnen den Fehler vom Modell selbst zurück. Es wird nicht in die Datenbank gehen, bis die Validierung erfüllt ist. –

+0

Auf diese Weise wird die Nicht-Null-Einschränkung auf Db-Ebene nicht durchbrochen, aber Sie erhalten die Validierungsmeldung "Name darf nicht leer sein" und die Bearbeitungsseite wird erneut gerendert wenn Sie es rendern –

Verwandte Themen