gpt4 book ai didi

ruby-on-rails - 愚蠢的rails问题: undefined method within class declaration

转载 作者:行者123 更新时间:2023-12-04 03:34:41 24 4
gpt4 key购买 nike

我有一个用户类,我试图在其中附加由工厂创建的配置文件。这是类(class):

class User < ActiveRecord::Base
acts_as_authentic
has_one :profile

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

end

工厂看起来像这样

class ProfileFactory
def self.create_profile(role)
String s = "#{role}#{"Profile"}"
Object.const_get(s).new
end
end

由于某种原因,它不会将自己识别为用户。这是我在调用 ProfileFactory.create_profile 时遇到的错误

undefined method 'role' for #<Class:0x2304218>

用户对象有一个角色:在其迁移中声明的字符串。

感谢任何帮助。

最佳答案

就使用您的工厂作为回调而言,Duncan 得到了正确答案。但它可能会帮助您了解出了什么问题。

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

after_create 是一个类方法,它向提供的 block 或作为参数列出的方法添加回调。提供给回调的 block (after_create、before_save 等)在类方法的上下文中进行解释。所以 self 指的不是正在创建的对象,而是正在创建的对象的 Class。

在这个片段中:

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

self 是 User 类,而不是您期望的 User 类的实例。

与 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

EmFi, This makes a lot of sense. So just to clarify, when invoking methods that are in the class from the callback methods but NOT actually in one of the callback methods, allows us to get around this class method problem, and use the current instance?

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

相反,您找到了解决实例方法问题的方法。你不能给回调一个类方法,但你可以给它一个 block ,它在其中调用一个。我想你也可以定义一个调用类方法的实例方法,但这似乎有点倒退。

关于ruby-on-rails - 愚蠢的rails问题: undefined method within class declaration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1598489/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com