2011-01-15 19 views

risposta

4

Grazie a tutti per le risposte rapide! Le tue risposte combinate mi hanno dato i pezzi di cui avevo bisogno per capire questo puzzle, penso.

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

sperimentando con questo caso particolare, questo è quello che ho scoperto:

In realtà, il: campo del nome non sarà persistente sul database.

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

imposterà solo l'attributo sull'oggetto, ma non persistono il: colonna del nome per il database. Come le seguenti 'parapetti 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 sostituirà setter di ActiveRecord * (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 che attr_accessible descriva i campi nel database che dovrebbero essere accessibili dall'esterno, in questo caso non sembra fare la differenza.

1

Poiché eredita ActiveRecord, verrà mantenuto quando si chiama il metodo save (ma non quando viene istanziato).

Se non si dispone di attributi per quel modello, suppongo che ActiveRecord salvi semplicemente una nuova riga nel database (ad esempio, il proprio oggetto avrà un persistente id). Ciò ha senso, poiché in seguito potresti aggiungere attributi al tuo modello User e le istanze persistenti dovrebbero essere ancora recuperabili.

5

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

attr_accessible consente semplicemente di assegnare il campo tramite assegnazione di massa (ad es. Con update_attributes). Questo è utile per motivi di sicurezza. Ulteriori informazioni dal MassAssignmentSecurity API docs.

70

attr_accessor è un codice ruby ​​e viene utilizzato quando non si dispone di una colonna nel database, ma si desidera comunque visualizzare un campo nei moduli. L'unico modo per consentire ciò è attr_accessor :fieldname e puoi utilizzare questo campo nella tua vista o modello, se lo desideri, ma principalmente nella tua vista.

attr_accessible consente di elencare tutte le colonne a cui si desidera consentire l'Assegnazione di massa, come indicato sopra. L'opposto di questo è attr_protected il che significa che questo campo NON vuole che a nessuno sia permesso di assegnarlo a Massa. Più probabilmente sarà un campo nel tuo database che non vorresti che qualcuno monkeying in giro. Come un campo di stato o simili.

+1

Unica risposta migliore Ho visto questa importante e fondamentale domanda. Per qualche motivo questo non è di solito indicato per le persone. Grazie. – Ethan

+1

Questa è una spiegazione molto buona delle differenze tra i due, ma non la domanda: cosa succede quando li usi entrambi nello stesso campo (o cosa succede con la persistenza). Per quello, vedi la mia risposta sommaria qui sotto. – Magne