2016-03-31 3 views
0
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-darwin14] 
Rails 4.2.5.2 

Also habe ich seit ein paar Tagen damit kämpfen und nicht sicher, wo ich mich konzentrieren soll. Mein Szenario: Mein Benutzer klickt auf eine Quellanforderungsansicht in REQUEST/index auf eine Schaltfläche, die eine neue Zeile in meiner PERFORMANCE-Zieltabelle erstellt und Attribute aus der Quelle zuweist. Gleichzeitig muss ich ein boolesches Attribut in der Quelltabelle (REQUEST) spiegeln.Wie kann ich eine Ruby-Methode schreiben, mit der ich eine neue Zeile in einer Zieltabelle erstellen kann, während ich ein Attribut in der Quelltabelle bearbeite?

Mein Code ist unten:

REQUEST VIEW

<%= new_performance_path(:attribute_id1 => (source.attribute_id1), :attribute_id2 => (source.attribute_id2), :attribute_id3 => (source.attribute_id3)), class: "btn btn-success" %> 

Performance Controller/NEW

def new 
    @performance = Performance.new(:attribute_id1 => params[:attribute_id1], :attribute_id2 => params[:attribute_id2], :attribute_id3 => params[:attribute_id3]) 
    @performance.completed = false 
    @performance.save 
    if @request.present? 
     @request.available = false # Need to assign 'false' to this boolean attribute 
     @request.save # Then save it. 
    end 
    redirect_to :performances 
end 

Während der Code die neue Zeile in meiner Performance-Tabelle erstellt, kann ich nicht herausfinden, die Methodensyntax, um das REQUEST-Tabellenattribut effektiv in "false" umzukehren. Dieser Code mit der if-Anweisung verarbeitet, ohne einen erorr zu werfen. Ich habe versucht, die ursprünglich diese in der Performance Controller/NEW, ohne die if-Anweisung, die in einem internen Server-Fehler führt:

def new 
    ... 
    @request.available = false 
    @request.save 
    ... 
    end 

RAILS KONSOLE

Completed 500 Internal Server Error in 29ms (ActiveRecord: 10.1ms) 

NoMethodError (undefined method `available=' for nil:NilClass): 
    app/controllers/performances_controller.rb:26:in `new' 

Also ich denke, das bedeutet, ich kann‘ t rufen Sie auf Anfrage in meinem Leistungsmodell an. Auf dieser Grundlage habe ich versucht, eine Methode zu meiner Performance-Modell hinzufügen ...

PERFORMANCE.RB

def available 
    Request.where(:available == true) 
    end 

... aber der Fehler bestehen bleibt. Ich denke, dass ich alle Zeilen in der REQUEST-Tabelle packen muss, wo der boolesche Wert "verfügbar" gleich true ist.

Beachten Sie, dass diese beiden Tabellen nicht direkt miteinander verwandt sind. REQUESTS ist eine Join-Tabelle in meinem Domänenmodell. Die App ist eine Musikanforderungs-App, also ein USER has_many: REQUESTS und: PERFORMANCES und ich verwende vorhandene Zeilen in der REQUEST-Tabelle, um neue Zeilen in der PERFORMANCE-Tabelle zu erstellen, muss aber die Zeile in der Anfragetabelle bearbeiten, wenn a Neue Zeile wird in der Leistung erstellt.

Danke Jungs. Ich lerne immer noch, dass ich neu bei Rails bin und ich habe besonders mit referenziellen Beziehungen zu kämpfen. Danke, dass Sie sich angesehen haben und mir geholfen haben.

+0

wird @request im Controller initialisiert? Kann es nicht in neuer Aktion sehen – Shishir

Antwort

0

@Shishir - Nach mehr Forschung auf dem Stack ich mein Modell landete machen fetteren mit einer neuen Methode & die Steuerung Ausdünnung. Dies scheint zu funktionieren.

Performance Controller/NEW

def new 
    ... 
    @performance.save 
    # After @performance is saved we point to new method in performance.rb 
    @performance.remove_request 
    # it then comes back for the redirect 
    redirect_to :performances, notice: "..." 
    end 

performance.rb

def remove_request 
    @request = Request.find_by(:available => true) 
    if @request.available == true 
     @request.available = false 
    end 
    @request.save 
    end 

Dadurch wird effektiv die Anforderung an 'falsch', die wie in meiner Anfrage Ansicht erwartet anzeigt. Danke für deine Hilfe, Kumpel und zwingt mich, anders darüber nachzudenken. Prost, mein Freund.

+0

Mein Code scheint also korrekt zu funktionieren, aber er dreht die Werte der Reihe nach, anstatt das richtige Objekt zu nehmen. Zum Beispiel, wenn ich Anfragen ID # 101 bis # 104 habe und zuerst # 103 auswählen muss, wird es stattdessen # 101 dann # 102, ad usw. spiegeln. Ich denke, das sollte eine einfache Lösung sein. Irgendwelche Hinweise? –

+0

Das Hinzufügen von: user_id => self.user_id zum Suchen initialisiert effektiv @ request und wählt die richtige Zeile aus. Gut zu gehen. –

0

@request Objekt ist Null in Ihrer Controller-Aktion neu. Daher der Fehler

undefined method `available=' for nil:NilClass 

Initialize @ request sollte den obigen Fehler beheben.

EDIT 1: ** schrieb Pseudo-Code, lesen Sie bitte die Kommentare haben Erläuterungen.

def new 
    # Load the user objects 
    @user = User.find(params[:user_id]) 

    # User has many performances, use build method to associated 
    # user and newly build performance. 
    @user.performance.build({ 
    :attribute_id1 => params[:attribute_id1], 
    :attribute_id2 => params[:attribute_id2], 
    :attribute_id3 => params[:attribute_id3], 
    :completed  => false; 
    }) 

    # User has one request (This is an assumption). 
    # if its is has many you can use the above mentioned method to 
    # create new request method same as performance. 
    if @performance.save 
     @user.request.available = false # Need to assign 'false' to this boolean attribute 
     @user.request.save # Then save it. 
    end 
    end 
    redirect_to :performances 
end 
+0

Versucht, dass. (@request = Request.find_by (: user_id => params [: user_id])) Dieser Code beseitigt die Fehlermeldung, löst jedoch nicht das Funktionsproblem. Die Seite wird umgeleitet, der boolesche Wert in Anforderungen bleibt jedoch unverändert. Irgendeine Idee, warum dieser Code nicht verarbeitet? –

+0

Sparen Sie! auf @request anstelle von save und um zu sehen, ob es einen Validierungsfehler gibt. – Shishir

+0

Gleich. Mit sparen! on (@request), es wirft keine Fehler auf. SQL zeigt alles in der Aktion, die gerade bearbeitet wird, mit Ausnahme der Zuweisung (@request) und speichert sie. Nachdem die Performance-Transaktion festgeschrieben wurde, wählt sie das @ request aus, aber ich sehe die boolesche Zuweisung oder das Speichern nicht. Immer noch keine Fehler! Irgendwelche Gedanken wohin ich als nächstes schauen soll? –

Verwandte Themen