Почему 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
Возвращенный объект имеет пустые строки для,country
town
и почтовый индекс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
ломает вещи здесь.
Кто-нибудь может пролить свет на то, чтобы остановить бедную душу от этого?