¿Por qué attr_accessor supera las variables existentes en este modelo en Ruby on Rails?
Me ha mordido esto recientemente, y sería útil saber exactamente qué sucede para que esto suceda, para que otros eviten este error.
Tengo un usuario modelo, con un esquema como el siguiente:
create_table "users", :force => true do |t|
t.string "user_name"
t.string "first_name"
t.string "last_name"
t.string "email"
t.string "location"
t.string "town"
t.string "country"
t.string "postcode"
t.boolean "newsletter"
En la clase user.rb, tengo un attr_accessor para tres métodos:
class User < ActiveRecord::Base
# lots of code
attr_protected :admin, :active
# relevant accessor methods
attr_accessor :town, :postcode, :country
end
Ahora en mi controlador de usuario, si tengo el siguiente método:
def create
@user = User.new params[:user]
end
Cuando intento crear un nuevo usuario con el contenido de este hash de parámetros:
--- !map:HashWithIndifferentAccess
# other values
country: United Kingdom
dob(1i): "1985"
dob(2i): "9"
dob(3i): "19"
town: london
El objeto devuelto tiene cadenas vacías para elcountry
, town
y el código postalpostcode
Valores, como tal.
(rdb:53) y user1
--- !ruby/object:User
attributes:
# lots of attributes that aren't relevant for this example, and are filled in okay
postcode:
country:
town:
Puedo decir que los métodos attr_accessor están obstruyendo los métodos de acceso existentes de Active Record, porque cuando los elimino todo funciona bien, por lo que la solución es bastante sencilla;
Peroqué ¿Qué está pasando exactamente aquí?
Estoy buscando aquí en elDocumentos API de Rails para Active Record, y aquí enLos propios documentos de Ruby sobreattr_accessor
, pero todavía estoy un poco confuso acerca de cómoattr_accessor
Está rompiendo cosas aquí.
¿Alguien capaz de arrojar algo de luz para evitar que otra alma pobre se contamine con esto?