wel*_*n97 5 module ruby-on-rails mixins
我试着这样做:
应用程序/模型/ my_model.rb:
class MyModel < ActiveRecord::Base
include MyModule
...
end
Run Code Online (Sandbox Code Playgroud)
LIB/my_module.rb:
module MyModule
before_destroy :my_func #!
def my_func
...
end
end
Run Code Online (Sandbox Code Playgroud)
但是我收到一个错误:
undefined method `before_destroy' for MyModule:Module
Run Code Online (Sandbox Code Playgroud)
我怎样才能纠正它.
我也是红宝石的新手.这些"属性"是什么类型:before_destroy,validates,has_many?它们是变量或方法还是什么?谢谢
ale*_*dev 14
before_destroy
,validates
等等不是属性或类似的东西.这些是方法调用.
在ruby中,类的主体是所有可执行代码,这意味着类主体的每一行都由interpeter执行,就像方法体一样.
before_destroy :my_func
是一种通常的ruby方法调用.被调用的方法是before_destroy
,它接收一个符号:my_func
作为参数.在调用它的范围内的类(或模块)中查找此方法.
所以继续你的问题,我想现在你应该明白,当解释器加载你的模块
module MyModule
before_destroy :my_func #!
def my_func
...
end
end
Run Code Online (Sandbox Code Playgroud)
它开始执行它的主体并before_destroy
在此模块中搜索该方法,但找不到该方法.你想要做的是不在模块上调用此方法,而是在包含模块的类中调用此方法.为此,我们使用该Module#included
方法有一个共同的习语:
module MyModule
module InstanceMethods
def my_func
...
end
end
def self.included(base)
base.send :include, InstanceMethods
base.before_destroy :my_func
end
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2225 次 |
最近记录: |