Schienen - Datensatz Hinzufügen, um zum Tisch vom controller
Ich versuche zu erstellen, die einen Datensatz innerhalb einer join-Tabelle aus der Aktion eine Schaltfläche. Ich hätte eine events-Modell und würde gerne verfolgen ausgewählte Ereignisse " von jedem Benutzer.
Benutzte ich die HABTM-Beziehung weil ich wirklich nicht brauchen extra-Felder.
Benutzer.rb:
has_to_and_belongs_to_many :events
Veranstaltung.rb:
has_to_and_belongs_to_many :users
Events_Users Migration:
[user_id, event_id, id=>false]
Ich bin immer fest auf die eigentliche Gestaltung der Aufnahme. Jemand half mir früher mit dem hinzufügen des Datensatzes in die Konsole:
u = User.find(1)
u.events << Event.find(1)
Nun möchte ich die Aktion durchführen, die als Ergebnis der Klick auf einen link... Ist das in die richtige Richtung?
def add
@user = User.find(session[:user_id])
@event = Event.find(params[:id])
if @user.events.save(params[:user][:event])
flash[:notice] = 'Event was saved.'
end
end
Sollte ich hinzufügen, ein @user.events.new
irgendwo und wenn ja wo muss ich die Parameter von dem Benutzer und welche Veranstaltung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Folgende code sollte funktionieren (vorausgesetzt, Sie übergeben einen parameter mit dem Namen id entspricht der id, die einem Ereignis-Objekt):
Die Probleme sehe ich in deinem code sind:
Übergeben Sie einen hash zu .speichern. Speichern sollte nur ein boolean Wert, ob die Validierungen ausgeführt werden soll, und ist standardmäßig true. Aber .erstellen und .neue annehmen können hash-Werte. (.speichern Sie die verwendet werden würde, nach .neue).
Laden Sie ein Ereignis durch params[:id], aber dann Sie versuchen, erstellen Sie ein Ereignis durch params[:user][:event]. Was möchten Sie tun? Erstellen oder laden? (mein Beispiel wird davon ausgegangen Last)
Aktionen, die einen Effekt haben wie dieser passieren soll, wenn ein Benutzer klickt auf einen button und ein Formular abschickt, anstatt einen Klick auf den link'. Dieser code wird möglicherweise anfällig für cross-site request forgery (Jemanden betrügen könnte jemand zum klicken auf einen link auf einer anderen Website, lief diese Aktion). Schienen bildet, wenn richtig umgesetzt, sind gegen dies, weil Sie verwenden eine request forgery protection token.
Meisten wahrscheinlich, dass Sie möchten, leiten Sie den Benutzer nach dieser Aktion. Rendern von Seiten nach der Ausführung von Aktionen wie diese (eher als die Umleitung) wird als schlechte Praxis.
Was du getan hast in der Konsole, die Sie brauchen, um im controller.
Die Sache hier zu beachten ist, dass die << operator für vorhandene Datensätze werden bewirken, dass der Verein beibehalten werden sofort.
Werfen Sie einen Blick auf die ActiveRecord-Dokumentation für mehr info.
Wenn die event_id übergeben params[:id] und Sie sind das hinzufügen nur ein Ereignis in diesem rufen Sie dann Folgendes tun können in Ihrem controller-code:
Brauchen Sie nicht explizit
save
zum speichern der has_many-Assoziation von einem vorhandenen Modell-Instanz.Szenario 1
Szenario 2