2016-07-26 4 views
0

Also, ich habe ein Programm, an dem ich schon seit einiger Zeit arbeite, das ist nur ein einfaches Barcode-Scansystem.Übergeben einer Rails-Variablen in eine Controller-Methode

Mein Controller für ein Raw gut ist wie folgt:

class RawsController < ApplicationController 
    def new 
     @raw = Raw.new 
    end 

     def create 
     @raw = Raw.new(params[raw_params]) 
     if @raw.save 
      receive(@raw) 
      redirect_to new_raw_path 
     end  
    end 

    def receive(raw) 
     scanned = Raw.find_by(code: raw.code) 
     if scanned.quantity.nil? 
      flash[:danger] = "no match" 
     else 
      scanned.quantity += 1 
      if scanned.save 
       respond_to do |format| 
        format.html {} 
        format.json{} 
       end 
      end 
     end 
    end 
private 
    def raw_params 
     params.require(:raw).permit(:code, :product, :quantity) 
    end 

end 

Nun, was ich geschehen soll, das heißt, wenn jemand eine Barcode-Nummer in ein Formular eingibt, es @raw als Instanz der schafft Roh (für Rohwaren) Klasse. Dann sucht es in der Empfangsfunktion nach einem passenden Produkt in meinem Inventar und fügt dann eine Einheit zu meinem Rohwarenbestand hinzu.

Wie auch immer ich einmal auf die scanned.quantity += 1 Linie komme, bekomme ich immer einen Fehler, dass diese Methode für nil Klasse undefiniert ist.

Ich habe in der scanned.quantity.nil? Zeile hinzugefügt, und ich bekomme diese Flash-Nachricht, damit ich weiß, das Problem hat mit der Menge zu tun, die Null ist. Aber ich bin mir nicht sicher, wie ich das beheben soll.

Irgendwelche Hilfe?

+0

Wie kommen Sie in dem Fall zu erhalten, dass 'scanned' Null ist? –

+0

Es ist nicht so, dass die "Menge" ist "Null", aber die "gescannt" ist "Null". Damit Sie die Fehlermeldung besser verstehen, ist 'quantity' die Methode, auf die Sie von' scanned' zugreifen möchten, was gleich 'nil' ist. – sjagr

Antwort

1

das Problem bei der Initialisierung ist bei Raw.new(...)

am Datum Suchen Sie in this comment geschrieben, könnte ich sagen, dass die Aktion nicht mit richtigen Attributen das Raw Objekt erstellt hat. Sie müssen die zulässigen Attribute verwenden, wenn Sie speichern möchten. Sie rufen new mit params[raw_params], die nil sein wird.Es sollte Raw.new(raw_params)

ändern sein:

def create 
    @raw = Raw.new(raw_params) 
    if @raw.save 
     receive(@raw) 
     redirect_to new_raw_path 
    end 
    end 
+0

Ja! Ich danke dir sehr. Ich hatte dieses Programm ursprünglich entworfen, ohne zu merken, dass ich starke Parameter berücksichtigen musste. Ein einfaches Problem, das durch eine schlechte Syntax verursacht wird. Das hätte ich nie realisiert. Nochmals vielen Dank. – Mascasc

0

Da Ihre if-Klausel mit scanned.quantity.nil? erfolgreich ist, bedeutet dies, dass scanned Objekt vorhanden ist aber quantity ist nil. Ich nehme an, Sie hatten keinen Standardwert von 0 darauf.

Idealerweise würde ich der Spalte quantity innerhalb der Migration, die diese Spalte zur Datenbank hinzufügt, einen Standardwert von 0 hinzufügen.

Sie können jedoch vor dem Ausführen des Inkrements auf 0 setzen. Außerdem müssen Sie nicht wirklich find_by wieder tun, da Sie bereits das Objekt Raw übergeben. Die Aktionen können für dieses Objekt selbst ausgeführt werden.

def receive(raw) 
    scanned = raw 

    if scanned.nil? 
     # your flash message 
    else 
     scanned.quantity ||= 0 
     scanned.quantity += 1 
     if scanned.save 
     respond_to do |format| 
      format.html {} 
      format.json{} 
     end 
     end 
    end 
end 
+0

Die Verwirrung für mich ist, dass ich in einigen Testvariablen in der Migration gesetzt habe, also ist Quantität nicht Null. – Mascasc

+0

kann das Ergebnis von 'puts @ raw.attributes' vor dem Aufruf' receive (@raw) 'einfügen? – aBadAssCowboy

+0

Auch brauchen Sie nicht wirklich das 'find_by' in der' receive' Methode, da Sie das Objekt, das Sie abrufen, bereits übergeben. Ich habe meine Antwort aktualisiert, um das widerzuspiegeln. – aBadAssCowboy

0

Sie versuchen += auf einem nil Wert, der ist, warum Sie diesen Fehler bekommen.

Wenn Sie neue Instanz @raw den Wert @raw.quantity schaffen ist nil

Verwenden after_initialize Menge auf 0

class Raw 
    after_initialize :set_quantity 

    def set_quantity 
    self.quantity = 0 
    end 
end 

Oder

eine Migration schreiben Menge Standardwert zu ändern zu 0

def change 
    change_column :raw, :quantity, :integer, default: 0 
end 
+0

Ich bekomme immer noch keine Übereinstimmung, was meiner Meinung nach bedeutet, dass meine Variable "gescannt" nicht gefunden wird. – Mascasc

+0

Es kann nicht "Null" sein, soweit ich denke. Sie speichern das '@ row' und geben es dann weiter und Sie' find_by' auf 'Raw' mit dem gleichen' code'. Es sollte anwesend sein. – aBadAssCowboy

+0

haben Sie Ihre Menge ist Null –

Verwandte Themen