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.
Unica risposta migliore Ho visto questa importante e fondamentale domanda. Per qualche motivo questo non è di solito indicato per le persone. Grazie. – Ethan
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