Ruby on rails 问题:类声明中未定义的方法

Ruby on rails 问题:类声明中未定义的方法,ruby-on-rails,factory,Ruby On Rails,Factory,我有一个用户类,我试图附加一个由工厂创建的配置文件。下面是课堂: class User < ActiveRecord::Base acts_as_authentic has_one :profile after_create {self.profile = ProfileFactory.create_profile(self.role)} end 出于某种原因,它不承认self是用户。这就是我在调用ProfileFactory.create\u profile时遇到的错误

我有一个用户类,我试图附加一个由工厂创建的配置文件。下面是课堂:

class User < ActiveRecord::Base
  acts_as_authentic
  has_one :profile

  after_create {self.profile = ProfileFactory.create_profile(self.role)}

end
出于某种原因,它不承认self是用户。这就是我在调用ProfileFactory.create\u profile时遇到的错误

未定义的方法“角色”
#

用户对象在其迁移中声明了role:String


感谢您的帮助。

为什么不做一些更简单的事情呢?比如:

class User < ActiveRecord::Base
  has_one :profile
  after_create :add_profile

  protected

    def add_profile
      self.create_profile(:role => self.role)
    end
end

class Profile < ActiveRecord::Base
  belongs_to :user

end
class用户self.role)
结束
结束
类配置文件

您可能来自Java背景吗?

问题中的
用户
对象在创建
块后作为参数传递给

class User < ActiveRecord::Base
  after_create do |user|
    user.profile = ProfileFactory.create_profile(user.role)
    user.save
  end
end
class用户
邓肯得到了正确的答案,他将你的工厂用作回调。但这可能有助于你了解出了什么问题

类方法接收类作为self,实例方法接收实例作为self。当您为块提供任何方法时,调用方法的范围将用于块

after_create是一个类方法,它向提供的块或列为参数的方法添加回调。提供给回调的块(创建后、保存前等)在类方法的上下文中解释。所以self不是指正在创建的对象,而是指正在创建的对象的类

在此片段中:

  after_create {self.profile = ProfileFactory.create_profile(self.role)}
self是用户类,而不是您期望的用户类的实例

与Matt暗示的更传统的after_create语法相比,在回调链中添加了实例方法。在此上下文中,self指的是实例

class User < ActiveRecord::Base
  has_one :profile
  after_create :add_profile

  protected

    def add_profile
      self.profile = ProfileFactory.create_profile(role)
    end
end
class用户
EmFi,这很有道理。所以 只是澄清一下,在调用方法时 那是从教室里来的 回调方法,但实际上不在 回调方法之一,允许我们 要绕过这个类方法 问题,并使用当前实例

是的,但不是因为你想的原因。回调仅在传递符号时查找实例方法


相反,您找到了一种绕过实例方法问题的方法。您不能给回调一个类方法,但可以为它提供一个块,它在其中调用一个类方法。我想您也可以定义一个实例方法来调用class方法,但这似乎有点倒退

马特-你一针见血。令人捧腹的谢谢。我原以为这会起作用,但它仍然抛出一个未知属性:角色错误。在迁移中,将在其中创建一个角色列。我只是仔细检查了users表,它还有一个role列。这些是我需要做的事情来让自我角色发挥作用吗?我尝试了self.email,但也失败了。有什么想法吗?不需要自我角色。只要扮演一个角色就行了。这里的问题是Matt不了解您的数据库结构。create_配置文件(:role=>self.role)正在尝试创建一个新的配置文件记录,其中role字段设置为用户的角色。用户有角色字段而不是profile.EmFi,这很有意义。因此,澄清一下,当从回调方法调用类中的方法,但实际上不在其中一个回调方法中时,允许我们绕过这个类方法问题,并使用当前实例?我的解释需要比注释更多的格式。答案已更新以解决您的新问题。解释得很好,我已经忘记了self是如何工作的。谢谢你详细解释!
class User < ActiveRecord::Base
  has_one :profile
  after_create :add_profile

  protected

    def add_profile
      self.profile = ProfileFactory.create_profile(role)
    end
end