2016-04-26 4 views
0
class EventTeam < ActiveRecord::Base 
    belongs_to :event 
    belongs_to :team 
end 

class Event < ActiveRecord::Base 
    has_many :event_teams 
    has_many :teams, through: :event_teams 
end 

class Team < ActiveRecord::Base 
    has_many :event_teams 
    has_many :events, through: :event_teams 
end 

beitritt Ich versuche, die hinzuzufügen: event_id und: team_id zum Eventteam Tisch kommen, wenn ein neues Ereignis erstellen und kann nicht scheinen, um herauszufinden, wie trotz einer erschöpfenden Suche von ähnlichen Fragen wie: how to add records to has_many :through association in rails (Ich habe alle diese Vorschläge versucht)Schienen hinzufügen Datensatz has_many: durch Tabelle

Es scheint, dass das folgende funktionieren sollte, obwohl ein NoMethodError geliefert wird: "undefined Methode` Ereignisse 'für #ActiveRecord :: Relation [] "

EreignisseController

def new 
    @event = Event.new(:team_id => params[:team_id]) 
end 

def create 
    @team = Team.where(:id => params[:team_id]) 
    @event = @team.events.create(event_params) 
    if @event.save 
    flash[:success] = "Event created!" 
    redirect_to @event 
    else 
    render 'new' 
    end 
end 

Ich habe eine ähnliche Situation in der gleichen App mit Benutzern, Teams und Mitgliedschaften (Join-Tabelle). Der folgende Code fügt der Tabelle "Mitgliedschaften" automatisch Folgendes hinzu: team_id und: user_id, wenn ein Benutzer ein neues Team erstellt.

TeamsController

def new 
    @team = Team.new(:user_id => params[:user_id]) 
end 

def create 
    @team = current_user.teams.create(team_params) 
    if @team.save 
    flash[:success] = "Team created!" 
    redirect_to @team 
    else 
    render 'new' 
    end 
end 

Vorschläge, wie dies zu erreichen?

Antwort

1

nicht definierte Methode `Ereignisse für #ActiveRecord :: Relation []

where geben eine AR Beziehung keine einzelne Instanz, so wird @team.events nicht funktionieren. Verwenden Sie find statt

@team = Team.find(params[:team_id]) 
@event = @team.events.create(event_params) 

aktualisieren

-Team nicht mit 'id' =

Sie erhalten team_id innerhalb event Hash finden konnte, so wird params[:team_id] nicht funktionieren . Sie müssen params[:event][:team_id]

@team = Team.find(params[:event][:team_id]) 
@event = @team.events.create(event_params) 
+0

aus irgendeinem Grund verwenden, erhalte ich die Fehlermeldung „konnte nicht-Team finden mit‚id‘= Wenn ich gerade auf 1 statt params [: team_id], wird das Ereignis erstellt und Datensatz hinzugefügt zur Join-Tabelle - so funktioniert .find statt .where funktioniert definitiv. Der seltsame Teil ist, ich kann team_id = 1 in der URL für den Pfad new_event sehen. – ncarroll

+0

@ncarroll Was sind die Parameter, die für diese Aktion generiert werden? – Pavan

+0

{ "UTF-8" => "✓", "authenticity_token" => "EryBDSRyQWO3zEXCjjz0J/Y9IOy0bfCw5tVhMnN + MiG0cOyJYWIWPNVihVbyP9C36raLXZ8B2uN8HR9PlCqTzg ==", "Ereignis" => { "Datum" => "2016.04.20", „name "=>" test ", " location "=>" test ", " venue "=>" test ", " team_id "=>" 1 "}, " commit "=>" Ereignis erstellen "} – ncarroll

0

Geben Sie einfach erste Wert der Beziehung, da Sie durch einen eindeutigen Index mit dem Wert suchen id, so dass sollte gut sein:

@team = Team.where(id: params[:team_id]).first 
@event = @team.events.create(event_params) 

Das weil .where ist, im Gegensatz zu find_by oder find(1) eine Relation Rückkehr nicht ein erster Wert darin.

Allerdings sah ich in der modernen Version der Schienen Empfehlung genau where.first Paar zu verwenden, nicht ein find.