Hier sind meine 3 Modelle.Erstellen und aktualisieren Sie mit verschachtelten Modellen mit starken Parametern Schienen
User
has_many :memberships
has_many :teams, through: :memberships, dependent: :destroy
accepts_nested_attributes_for :memberships
Team
has_many :memberships
has_many :users, through: :memberships, dependent: :destroy
accepts_nested_attributes_for :memberships
Membership
belongs_to :team
belongs_to :user
Hier sind einige Teile meines Team Controllers. Mein Ziel ist es, Mitglieder zu einem bestimmten Team hinzuzufügen/zu aktualisieren. Beachten Sie, dass die Quelle zum Hinzufügen von Mitgliedern bereits als Benutzergruppe vorhanden ist.
TeamsController
def create
@team = Team.new(team_params)
@team.users << User.find(member_ids) #add leader and members to team
if @team.save
#redirect to created team
else
#show errors
end
end
def update
#TO DO: update team roster here
if @team.update(team_params)
#redirect to updated team
else
#show errors
end
end
Starke Parameter für Team-Controller
#parameters for team details
def team_params
params.require(:team).permit(:name, :department)
end
#parameters for members (includes leader)
def members_params
params.require(:team).permit(:leader, members:[])
end
#get id values from members_params and store in an array
def member_ids
members_params.values.flatten
end
Für die Form, ich habe nur:
- Name (Textfeld)
- Department (Combo-Box)
- Führer (Kombinationsfeld mit Optionen, die abhängig von der ausgewählten Abteilung generiert werden, wird als Benutzer-ID eines ausgewählten Benutzers übergeben)
- Mitglieder (Combo-Box, mit Optionen mehr, erzeugen in Abhängigkeit von der Abteilung ausgewählt, tragen als einen Array von ausgewählten Benutzern Benutzer-IDs)
ich ein Team erfolgreich erstellen kann, zusammen mit der Verabschiedung von Validierungen (sowohl Team als auch Mitgliedschaftsmodell), auf meinem erstellen. Allerdings habe ich keine Ahnung, wie man das Team auf den neuesten Stand bringt, denn wenn ich @team.users.clear
benutze und dann einfach dasselbe von create mache (ich weiß, es ist ein bisschen blöd das zu tun), wird es validieren, aber es wird es trotzdem speichern wenn ein Fehler vorliegt oder nicht.
FORM CODE
<%= form_for(@team, remote: true) do |f| %>
<%= f.label :name, "Name" %>
<%= f.text_field :name %>
<%= f.label :department, "Department" %>
<%= f.select :department, options_for_select(["Architectural", "Interior Design"], department), include_blank: true %>
<%= f.label :leader, "Leader" %>
<%= f.select :leader, select_leaders(department, @team.id), {include_blank: true, selected: pre_select(:leader)} %>
<%= f.label :members, "Members" %>
<%= f.select :members, select_members(department, @team.id), {include_blank: true}, {id: "team_members", multiple: :multiple, data: {member_ids: pre_select(:members)}}%>
<% end %>
Anmerkung für die Form:
- Diese Form für arbeitet sowohl leer und besiedelten Formen.
- Das Feld
:members
ist select2 aktiviert.
Also meine Fragen sind hier:
- Wie kann ich Mitglieder der Mannschaft aktualisieren? Ist es möglich, basierend auf meinen starken Parametern zu aktualisieren, oder müssen sie überarbeitet werden?
- Sollte meine create-Methode auch überarbeitet werden?
einige Optionen SOLUTION LEADING
Option # 1 (beste Lösung bisher)
Ich habe nur eine Erste-Hilfe-Lösung für diese, so dass ich denke, es ist ein besserer Ansatz als das, was Ich habe es getan. Was ich hier gemacht habe, ist, Benutzer-Params mit den Benutzern zu erstellen, die von den Member-IDs als Werte gefunden wurden.
TeamsController
def create
team = Team.new(team_params.merge({users: User.find(member_ids)}))
...
end
def update
...
if @team.update(team_params.merge({users: User.find(member_ids)}))
..
end
Option # 2
Unabhängig von Lösung 1 hatte ich nur team_params
so stark Parameter.
TeamsController
...
private
def team_params
params.require(:team).permit(:name, :department, :leader, members:[])
end
Ich erstellte Setter-Methoden für beide Führer und Mitglieder. Aber es scheint, dass Mitglieder den Leader-Setter überschreiben, weil ich die update
-Methode für beide Setter verwendet habe, und das Update verwendet die gleiche Ressource wie die Benutzer. Ein Workaround scheint mit dieser Option möglich zu sein.
Team
...
def leader=(leader_id)
#self.update(users: User.find(leader_id))
end
def members=(members_ids)
#self.update(users: User.find(members_id))
end
Bitte senden Sie Ihren Formularcode, damit andere Ihr Anliegen besser verstehen, indem Sie den Code mit mehr Klarheit in Beziehung setzen. – Surya
Es ist nicht klar, warum Sie 2 Auswahlen haben (eine für Anführer, eine für Mitglieder) und dann nicht speichern, wer Anführer ist. – MikDiet
Um Mitgliedschaften in Führer und Mitglieder zu trennen, damit Benutzer die Form besser verstehen. Alle Mitgliedschaften (ob Leiter oder Mitglied) werden als Mitglieder als Ganzes über das Mitgliedschaftsmodell gespeichert. Ich habe meinen Beitrag bearbeitet, damit Sie sehen können, was ich bisher versucht habe. – oLraX