Почему attr_accessor блокирует существующие переменные в этой модели в Ruby on Rails?

Я был укушен этим недавно, и этоБыло бы полезно точно знать, чтоЭто происходит, чтобы другие могли избежать этой ошибки.

У меня есть модель пользователя с такой схемой:

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"

В классе user.rb у меня есть attr_accessor для трех методов:

class User < ActiveRecord::Base

# lots of code

  attr_protected :admin, :active

# relevant accessor methods

  attr_accessor :town, :postcode, :country 

end

Теперь в моем пользовательском контроллере, если у меня есть следующий метод:

def create
    @user = User.new params[:user]
end

Когда, когда я пытаюсь создать нового пользователя с содержимым в этом хэше params:

  --- !map:HashWithIndifferentAccess 
  # other values
  country: United Kingdom
  dob(1i): "1985"
  dob(2i): "9"
  dob(3i): "19"
  town: london

Возвращенный объект имеет пустые строки для,countrytown и почтовый индексpostcode ценности, как и так.

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

Я могу сказать, что методы attr_accessor забивают Active Record 'Существуют методы доступа, потому что когда я их вынимаю, все работает нормально, поэтому решение довольно простое - просто уберите их.

Нокакие что именно происходит, когда здесь?

я смотрю здесь, вДокументация по Rails API для Active Recordи здесь, вРубин'собственные документы оattr_accessor, но я'м еще немного смутно о томattr_accessor ломает вещи здесь.

Кто-нибудь может пролить свет на то, чтобы остановить бедную душу от этого?

Ответы на вопрос(3)

Ваш ответ на вопрос