Во-первых, я предполагаю, что модель User
сохраняется в вашем приложении Rails. Это означает, что у вас уже есть мигрировали User
перед запуском rails console
.
Если таблица не существует, вам будет предложено instanly с:
=> Пользователь (таблица не существует)
Теперь давайте повеселимся в rails console
:
Прежде всего, не переопределяйте метод initialize
в модели Rails; При создании метода инициализации объекта из ActiveRecord имеет приоритет (я думаю), поэтому он может создавать конфликты. Вместо этого используйте обратный вызов after_initialize
. В консоли:
class User < ActiveRecord::Base
attr_accessible :name, :email
def after_initialize(attributes = {})
self[:name] = attributes[:name]
self[:email] = attributes[:email]
end
def formatted_email
"#{self.name} <#{self.email}>"
end
end
Теперь
u = User.new({name: "Foo", email: "[email protected]"})
#<User name: "Foo", email: "[email protected]", created_at:nil updated_at: nil>
u.formatted_email
#=> "Foo <[email protected]>"
Все сделано! Милая.
UPDATE:
В соответствии с вашей недавней gist; Я не вижу смысла иметь after_initialize
. Rails делает это самостоятельно.
Прежде всего, замените attr_accessor
на attr_accessbile
.
attr_accessor
- метод ruby (любезность, метапрограммирование), который создает геттер и сеттер для предоставленной переменной экземпляра. Rails использует для этого attr_accessible
; для соображений безопасности только переменные экземпляра, разрешенные в attr_accessible
, допускают массовое присвоение (путем отправки хэша параметров).
user.rb
class User < ActiveRecord::Base
attr_accessible :name, :email
#def after_initialize(attributes = {})
# self[:name] = attributes[:name]
# self[:email] = attributes[:email]
#end
def formatted_email
"#{self.name} <#{self.email}>"
end
end
в соответствии с вашим учебным пособием, они просят вас использовать «имя:», «по электронной почте:« »' не ': name =>" ",: email =>" "' это может быть вашей проблемой? – sircapsalot
Я думал, что это может быть проблемой. Но я пробовал оба стиля без успеха. – gprasant