Ecco i miei 3 modelli.Creare e aggiornare con modelli nidificati utilizzando parametri forti Rotaie
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
Ecco alcune parti del controller del mio team. Il mio obiettivo qui è quello di aggiungere/aggiornare i membri ad un determinato team. Nota che la fonte per aggiungere membri esiste già come gruppo di utenti.
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
parametri forti per regolatore della squadra
#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
Per la forma, mi hanno solo:
- Nome (campo di testo)
- Dipartimento (casella combinata)
- leader (casella combinata, con le opzioni generate in base al reparto selezionato, invia come ID utente dell'utente selezionato)
- Utenti (casella combinata, multipla, con le opzioni generate a seconda del reparto selezionato, sottopone come una serie di selezionati degli utenti user id)
posso creare con successo una squadra, insieme con il passare delle convalide (sia la squadra che il modello di appartenenza), sulla mia creazione. Tuttavia, non ho idea di come aggiornare il team, perché se uso @team.users.clear
e poi faccio semplicemente la stessa cosa da creare (lo so, è un po 'stupido farlo), lo convaliderà, ma lo salverà indipendentemente se c'è un errore o no.
codice del modulo
<%= 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 %>
Nota per la forma:
- Questo modulo funziona sia per i moduli in bianco e popolate.
- Il campo
:members
è selezionato2 attivato.
Quindi le mie domande sono qui:
- Come posso aggiornare i membri della squadra? È possibile aggiornare in base a quali sono attualmente i miei parametri forti o devono essere modificati?
- Il metodo di creazione deve essere modificato?
alcune opzioni CONDUCE AL SOLUZIONE
Opzione # 1 (soluzione migliore finora)
ho fatto solo una soluzione di pronto soccorso per questo, quindi penso che ci sia un approccio migliore di quello che Ho fatto sotto. Quello che ho fatto qui è creare i parametri degli utenti con gli utenti trovati da member_ids come valori.
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
Opzione # 2
Indipendente dalla soluzione 1, ho avuto solo team_params
forte parametro.
TeamsController
...
private
def team_params
params.require(:team).permit(:name, :department, :leader, members:[])
end
Ho creato metodi di setter sia per il leader che per i membri. Ma sembra che i membri sovrascrivano il leader setter perché ho usato il metodo update
per entrambi i setter e l'aggiornamento utilizza la stessa risorsa che è l'utente. Una soluzione alternativa sembra essere possibile con questa opzione.
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
Si prega di inviare il codice del modulo, aiuterà gli altri a capire la vostra preoccupazione, mettendo in relazione il codice con maggiore chiarezza. – Surya
Non è chiaro, perché hai 2 selezioni (una per il leader, una per i membri) e quindi non memorizzare da nessuna parte chi è il leader. – MikDiet
Per separare le iscrizioni in leader e membri per l'utente per capire meglio il modulo. Tutte le iscrizioni (che siano leader o membri) vengono archiviate come membri nel loro complesso attraverso il modello di appartenenza. Ho modificato il mio post in modo da poter vedere ciò che ho provato finora. – oLraX