gpt4 book ai didi

ruby-on-rails - 我可以在 Rails 模型中定义方法吗?

转载 作者:数据小太阳 更新时间:2023-10-29 06:28:41 26 4
gpt4 key购买 nike

我的 Rails 模型有代码试图在模型中define_method(method_name)

我不断得到:

NoMethodError: undefined method `define_method'

我做错了什么?我在错误的地方这样做吗?我需要将此方法附加到此模型。我还可以在哪里定义此方法?

编辑:对于那些要求查看代码的人:

for field in rdev_fields
next if self.attributes.include?(field)
count = count + 1
rdev_hash[field.to_sym] = self.attributes["attribute#{count}"]
if !self.respond_to?(field) then
define_method("#{field}") do
self.send("attribute#{count}".to_sym)
end
end
end

最佳答案

Rails 模型并没有什么神奇之处,它只是一个带有一堆预先存在的方法的普通类,

那么,问题是“我可以在类中定义_method”吗?

第 1 部分:是的,你可以。

重要的区别在于您可以在中定义方法,而不是在实例中方法

例如:

class Cow
define_method "speak" do
"MOOOO"
end
end

Cow.new.speak
=> "MOOOO"

这应该可以正常工作。请注意,您是在类 Cow 上定义它,因此您已经拥有的任何其他 Cows 都会自动添加该方法。

第 2 部分:如果您想从实例方法中定义方法,您会怎么做?

您不能从实例方法中定义方法,因此您必须获取类,并使用它来定义方法。像这样:

class Cow
def add_speak
self.class.send(:define_method, :speak) do
"MOOOO added"
end
end
end

Cow.new.speak
NoMethodError: undefined method 'speak' for #<Cow:0xb7c48530>

Cow.new.add_speak
Cow.new.speak
=> "MOOOO added"

问题解决了。精明的读者会注意到,在这个例子中,我使用的是 send(:define_method) - 这是必需的,因为 define_method 是私有(private)的,私有(private)方法只能被它们访问的对象访问在这个例子中,define_method在类中,我们在实例中,所以不能直接访问。

不过如上所述,我们将方法直接添加到类中,因此所有其他已经存在的 Cows 也会自动添加 speak 方法。

第 3 部分:如果您只想为一个对象而不是该类的所有对象定义一个方法,您会怎么做?

例子:

class Cow
def add_speak_just_me
class << self
define_method "speak" do
"MOOOO added for just me"
end
end
end
end

Cow.new.speak
NoMethodError: undefined method 'speak' for #<Cow:0xb7c72b78>

c = Cow.new
c.add_speak_just_me
c.speak
=> "MOOOO added for just me" # it works, hooray

Cow.new.speak # this new cow doesn't have the method, it hasn't been automatically added
NoMethodError: undefined method `speak' for #<Cow:0xb7c65b1c>

这是如何运作的?你去兔子洞!

阅读:http://dannytatom.me/metaid/还有祝你好运。当您意识到向实例“添加方法”实际上根本不是将其添加到实例时,它会有所帮助:-)

关于ruby-on-rails - 我可以在 Rails 模型中定义方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/302789/

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