Domanda

Che cosa accade in background con il seguente codice?

class User < ActiveRecord::Base

 attr_accessor :name
 attr_accessible :name

end

Suggerimento: Quando si crea un'istanza della classe, sarà persistito nel database? Perché o perché no?

È stato utile?

Soluzione 3

Grazie a tutti per le risposte veloci! Le risposte combinate mi ha dato i pezzi che avevo bisogno di capire questo puzzle, credo.

(In un problema correlato, mi è stato sempre un sacco di errori nil come "oggetto non supporta #inspect", e " 'chiavi' metodo non definito per nil: NilClass". Sono riuscito a risolverlo ora, rimuovendo il campo att_accessor del tutto.)

Con la sperimentazione di questo caso particolare, questo è quello che ho scoperto:

In realtà, il: campo del nome non verrà persistito nel database.

user = User.new(:name=>"somename")

Sarà solo impostare l'attributo per l'oggetto, ma non persistono il: colonna del nome per il database. Come il seguente 'rotaie' console spettacoli di uscita:

> user
=> <User id: nil, created_at: nil, updated_at: nil>
> user.save
=> true
> user
=> <User id:1, created_at: 2011-01-19 12:37:21, updated_at: 2011-01-19 12:37:21>

Presumo che ciò è dovuto al fatto * il setter fatta da attr_accessor avrà la precedenza di ActiveRecord setter * (che si occupa della persistenza database). È ancora possibile recuperare il valore dal: campo del nome dall'oggetto, però, in questo modo:

> user.name
=> "somename"

Quindi, in conclusione, ho imparato che l'utilizzo di attr_accessor sui campi potrebbe portare a loro non essere persistito nel database. E mentre pensavo attr_accessible descrive i campi del database che dovrebbe essere accessibile dall'esterno, non sembra fare la differenza in questo caso.

Altri suggerimenti

attr_accessor è il codice ruby ??e viene usato quando non si dispone di una colonna nel database, ma ancora voglia di mostrare un campo nei moduli. L'unico modo per permettere che questo è quello di attr_accessor :fieldname ed è possibile utilizzare questo campo in vista, o modello, se si voleva, ma soprattutto nella vista.

attr_accessible consente di elencare tutte le colonne che si desidera consentire la messa assegnazione, come Andy sfuggiva sopra. L'opposto di questo è attr_protected che significa che questo campo non voglio che nessuno di essere autorizzato a messa Assegna a. Quindi più probabile che sta per essere un campo nel database che non vuoi che qualcuno monkeying in giro con. Come un campo di stato, o simili.

Nella maggior parte dei casi, non è necessario utilizzare attr_accessor se il campo è una colonna della tabella users nel database. ActiveRecord sarà capirlo per te.

attr_accessible permette semplicemente al campo da assegnare mediante assegnazione di massa (per esempio, con update_attributes). Questo è un bene per motivi di sicurezza. Maggiori informazioni dal MassAssignmentSecurity Documentazione API .

Dal eredita ActiveRecord, sarà persistente quando si chiama il metodo save (ma non quando viene creata un'istanza).

Se non si dispone di attributi per quel modello, presumo ActiveRecord semplicemente salvare una nuova riga nel database (vale a dire l'oggetto avrà solo un id persistente). Questo ha senso, come si potrebbe poi aggiungere attributi al modello User, e il persisteva casi devono ancora essere recuperabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top