3

我正在尝试在 Rails 控制台中做

>> user = User.new(:name => "", :email => "test@example.com")
=> #<User not initialized>

我的用户类看起来像

class User < ActiveRecord::Base
  attr_accessor :name, :email
  has_many :microposts

  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end 

  def formatted_email
    "#{@name} <#{@email}>"
  end
end

我正在关注rails tutorial。为什么我无法初始化对象?

4

4 回答 4

4

tl; dr:完全从书中复制,你应该没问题。(:我是作者。)

有问题的示例来自Ruby on Rails 教程书第 4 章不是Active Record 模型。特别是,问题中显示的 User 类基于清单 4.9

class User
  attr_accessor :name, :email

  def initialize(attributes = {})
    @name  = attributes[:name]
    @email = attributes[:email]
  end

  def formatted_email
    "#{@name} <#{@email}>"
  end
end

此类继承自ActiveRecord::Base,而是必须使用 显式包含在控制台中require './example_user.rb',如第 4.4.5 节所述。您看到的行为是包含< ActiveRecord::Base在第一行中的结果,但是如果您准确复制清单 4.9中的代码,您应该会看到预期的行为。

于 2013-06-05T21:37:10.210 回答
2

您是否在与项目相同的文件目录中运行控制台?我还会尝试将符号切换到书中使用的示例,看看是否能让你有所收获。

也可以尝试不带属性调用User.new,看是否生成教程6.1.3中列出的对象,然后填写属性看是否有效。

还要确保您没有对模型中的用户名进行验证。

最后一次检查你可以运行 user.error 看看为什么它可能没有保存

于 2013-06-04T18:07:09.637 回答
2

首先,我假设User模型在您的 Rails 应用程序中仍然存在。这意味着,在运行Userrails console.
如果该表不存在,系统会立即提示您:

=> 用户(表不存在)

现在,让我们玩得开心rails console
首先,不要覆盖initializeRails 模型中的方法;虽然从 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: "foo@bar.org"})
#<User name: "Foo", email: "foo@bar.org", created_at:nil updated_at: nil>
u.formatted_email
#=> "Foo <foo@bar.org>"

全部完成!甜的。

更新
根据你最近的要点;我认为没有任何意义after_initialize。Rails 自己做到这一点。
首先,替换attr_accessorattr_accessbile.
attr_accessor是 ruby​​ 方法(礼貌,元编程),它为提供的实例变量创建 getter 和 setter。Railsattr_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
于 2013-06-04T20:24:52.327 回答
0

您是否使用rails c命令运行控制台从项目的根目录加载环境?键入irb启动控制台会话不会自行加载 Rails 应用程序环境。

这里有一些更多的故障排除技巧

  • 检查以确保指定的开发数据库config/database.yml正在运行
  • 检查以确保存在迁移以创建用户表
  • 检查以确保迁移已运行rake db:migrate
  • 检查以确保数据库中确实存在用户表,字段类型为varchar(或text):名称和:电子邮件
于 2013-06-04T20:08:07.343 回答