2011-01-15 7 views

Respuesta

4

¡Gracias a todos por sus rápidas respuestas! Tus respuestas combinadas me dieron las piezas que necesitaba para entender este rompecabezas, creo.

(En un problema relacionado, recibía muchos errores nulos como "Objeto no admite #inspect" y "método indefinido 'claves' para nil: NilClass". Pude resolverlo ahora, por . retirar el campo att_accessor en total)

al experimentar con este caso particular, esto es lo que he encontrado:

en realidad, el nombre de campo no será persistieron a la base de datos.

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

Solo establecerá el atributo en el objeto, pero no persistirá la columna: name en la base de datos. Al igual que los siguientes 'barandas consola' espectáculos de salida:

> 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> 

Asumo que esto se debe a que el colocador * hecha por attr_accessor anulará colocador de ActiveRecord * (que se encarga de la persistencia de base de datos). Todavía se puede recuperar el valor de la: campo de nombre del objeto, sin embargo, como esto:

> user.name 
=> "somename" 

Así que, en conclusión, he aprendido que el uso de attr_accessor en los campos podría dar lugar a que no se persistido a la base de datos .Y aunque pensé que attr_accessible describe los campos en la base de datos que deberían ser accesibles desde el exterior, no parece marcar la diferencia en este caso.

1

Dado que hereda ActiveRecord, se mantendrá cuando llame al método save (pero no cuando se crea una instancia).

Si no tiene ningún atributo para ese modelo, supongo que ActiveRecord simplemente guardará una nueva fila en la base de datos (es decir, su objeto solo tendrá un id persistente). Esto tiene sentido, ya que más adelante puede agregar atributos a su modelo User, y las instancias persistentes aún deberían poder recuperarse.

5

En la mayoría de los casos, no necesita usar attr_accessor si el campo es una columna en la tabla users en su base de datos. ActiveRecord lo resolverá por ti.

attr_accessible simplemente permite que el campo se asigne mediante asignación masiva (por ejemplo, con update_attributes). Esto es bueno por motivos de seguridad. Más información del MassAssignmentSecurity API docs.

70

attr_accessor es código ruby ​​y se utiliza cuando no tiene una columna en su base de datos, pero aún desea mostrar un campo en sus formularios. La única manera de permitir esto es attr_accessor :fieldname y puede usar este campo en su Vista, o modelo, si lo desea, pero principalmente en su Vista.

attr_accessible le permite listar todas las columnas que desea permitir la Asignación masiva, como se omite anteriormente en andy. Lo opuesto a esto está attr_protected, lo que significa que NO quiero que a nadie se le permita Mass Assign to this. Más probable es que sea un campo en su base de datos con el que no quiere que nadie mordique. Como un campo de estado, o similar.

+1

Sola mejor respuesta que he visto a esta pregunta masivamente importante y básica. Por alguna razón, esto simplemente no se explica para las personas. Gracias. – Ethan

+1

Esta es una muy buena explicación de las diferencias entre los dos, pero no es la pregunta: ¿qué sucede cuando los usa tanto en el mismo campo (o lo que sucede con la persistencia). Para eso, se mi resumen de respuesta a continuación. – Magne

Cuestiones relacionadas