Si sta utilizzando una terminologia tecnica in modo vago che rende confusa la comprensione di questo processo, quindi chiarirò prima questa terminologia.
dove e come posso assegnare l'utente a: ruolo di amministratore
Il 'ruolo' utilizzato nel parametro :as
a attr_accessible
non è un ruolo utente. È un attributo attributo. Significa che l'attributo è protetto dalla sovrascrittura a meno che tale ruolo non sia specificato nell'istruzione che imposta l'attributo. Quindi, questo sistema è indipendente da qualsiasi sistema utente. La tua applicazione non ha nemmeno bisogno di avere utenti per avere ruoli nell'assegnazione di massa.
posso definire il mio ruolo come group_to_update
ruoli non sono realmente "definiti" in ogni senso formale a tutti. In ogni luogo in cui è previsto un ruolo, è sufficiente utilizzare qualsiasi simbolo/stringa (ad esempio :group_to_update
) come ruolo. Non c'è bisogno di specificarlo altrove prima del tempo.
Ecco come funziona. Normalmente, durante l'assegnazione di massa di un hash per modellare gli attributi, tutti gli attributi del modello vengono usati come chiavi per l'hash assegnato.Quindi, se si dispone di un modello Barn
e barn
istanza di esso, con tre attributi horse
, cat
, e rabbit
, allora questo:
barn.attributes = params
è essenzialmente lo stesso di fare:
barn.horse = params[:horse]
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Ora, se imposti qualsiasi attr_accessible
sul modello della stalla, solo gli attributi che hai impostato verranno aggiornati quando si utilizza l'assegnazione di massa. Esempio:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit
end
Allora questo:
barn.attributes = params
farà solo questo:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Perché solo 'gatto' e 'coniglio' sono impostati accessibile ('cavallo' non è). Ora potresti chiamare un ruolo come questo attributo:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
end
In primo luogo, si noti che il ruolo può da tutto quello che vuoi fintanto che si tratta di un simbolo/string. In questo caso, ho assunto il ruolo :banana
. Ora, quando si imposta un ruolo su un attributo attr_accessible
, normalmente non viene assegnato. Questo:
barn.attributes = params
ora solo fare questo:
barn.cat = params[:cat]
ma è possibile assegnare gli attributi con un ruolo specifico utilizzando il metodo assign_attributes
. Così si può fare:
barn.assign_attributes(params, :as => :banana)
Ciò assegnare tutti params normalmente protetti così come tutti params protette in virtù del ruolo :banana
:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Quindi consideriamo un esempio più lungo con più attributi:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
attr_accessible :horse, :as => :banana
attr_accessible :cow, :as => :happiness
end
Quindi è possibile utilizzare tali ruoli quando si assegnano attributi. Questo:
barn.assign_attributes(params, :as => :banana)
corrisponde a:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
barn.horse = params[:horse]
E questo:
barn.assign_attributes(params, :as => :happiness)
corrisponde a:
barn.cat = params[:cat]
barn.cow = params[:cow]
Ora, se si sceglie di , puoi creare ruoli utente (ad es. una colonna "ruolo" sul modello utente) corrisponde ai ruoli attributo su qualsiasi modello.Così si potrebbe fare qualcosa di simile:
barn.assign_attributes(params, :as => user.role)
Se ruolo che questo user
s' sembra essere banana
, quindi (usando il nostro ultimo esempio modello) sarà impostare gli attributi sul granaio per il gatto, coniglio, e il cavallo. Ma questo è solo un modo per usare i ruoli degli attributi. Spetta interamente a te se vuoi usarli in un modo diverso.
+1 Ottima risposta. – Gazler
Grazie. Probabilmente è l'unico post che entra nel grande dettaglio del ruolo in attr_accessible. Ancora una domanda: in che modo il ruolo impedirà l'assegnazione di massa? Non c'è modo per un hacker di includere il ruolo nell'URL? – user938363
Ottima risposta. Questo dovrebbe essere da qualche parte [nelle guide?] Nei documenti di Rails. – maprihoda