sal*_*cer 23 ruby ruby-on-rails
我的rails模型具有试图define_method(method_name)进入模型内部的代码.
我一直在:
NoMethodError: undefined method `define_method'
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我是在错误的地方做这件事吗 我需要附加到此模型的此方法.我还能在哪里定义这种方法?
编辑:对于那些要求查看代码的人:
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
Run Code Online (Sandbox Code Playgroud)
Ori*_*rds 79
没有什么神奇的或关于rails模型,它只是一个普通的类,有一堆预先存在的方法,
所以,问题是"我可以在课堂上定义方法吗?"
重要的区别在于您可以在类中定义方法而不是在实例方法中
例如:
class Cow
define_method "speak" do
"MOOOO"
end
end
Cow.new.speak
=> "MOOOO"
Run Code Online (Sandbox Code Playgroud)
这应该工作正常.请注意,您正在类Cow上定义它,因此您已经拥有的任何其他Cows将自动添加该方法.
您无法从实例方法定义方法,因此您必须获取类,并使用它来定义方法.像这样:
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"
Run Code Online (Sandbox Code Playgroud)
问题解决了.精明的读者会注意到,在这个例子中我正在使用send(:define_method)- 这是必需的,因为它define_method是私有的,私有方法只能被他们所在的东西访问.在这种情况下,define_method在类中,我们在实例中,所以我们无法直接访问它.
如上所述,我们将该方法直接添加到类中,因此已经存在的所有其他Cows也将自动添加speak方法.
例:
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>
Run Code Online (Sandbox Code Playgroud)
这是如何运作的?你去了rabbithole!
阅读本文:http://dannytatom.me/metaid/祝你好运.当你意识到向实例添加"方法"实际上并没有将它添加到实例时会有所帮助:-)
如果您来这里是为了寻找如何动态定义 CLASS 方法,define_method因为它不起作用(因为它定义了 INSTANCE 方法),这里是您的答案:
使用define_singleton_method:)