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

Respuestas a la pregunta(3)

Su respuesta a la pregunta