Ruby on rails &引用;“未给出块”;以编程方式定义调用时
我正在尝试编写一个库,该库将通过编程方式向ActiveRecord模型添加Ruby on rails &引用;“未给出块”;以编程方式定义调用时,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在尝试编写一个库,该库将通过编程方式向ActiveRecord模型添加around\u update/around\u destroy回调 因此,常规模型如下所示,并按预期工作: class用户
around\u update
/around\u destroy
回调
因此,常规模型如下所示,并按预期工作:
class用户
我的小库(显然只是骨架)如下所示:
#用于在模型中创建回调的模块
模块划分
模块时间线
def包括在内(klass)
发送(:extend,ClassMethods)
结束
模块类方法
def timeline_for(事件,选项={})
方法_name=:“用于{event.to_s}的时间线_”
定义_方法(方法_名称)do |块(&block)|
Rails.logger.debug方法\u name.to\u s
屈服块
Rails.logger.debug“在#{method_name.to_s}中产生后”
结束
发送(:关于更新,方法名称)
结束
结束
结束
结束
它为方法定义了一个timeline\u,该方法应添加timeline\u for\u update方法,并将其作为around\u update事件的回调。我想使用的用户模型是:
使用Piddle创建回调的用户模型的第二个版本
需要“皮德尔/皮德尔”
类用户有什么想法或替代方案吗?如果你想定义这样的东西。了解主动支持关注点 我认为您需要在类上调用around过滤器,而不是在定义本身中使用send:
问题在于,如果从
定义方法调用yield
,ruby将其解释为试图屈服于传递给时间线的块(不存在),而不是块
将rails传递给\u foo的timeline\u
您已将block
传递给您,因此您可以调用它:
def timeline_for event
method_name = "timeline_for_#{event}"
define_method method_name do |&block|
ActiveRecord::Base.logger.debug "before #{method_name} yield"
block.call
ActiveRecord::Base.logger.debug "after #{method_name} yield"
end
send :around_update, method_name.to_sym #must use a symbol here
end
谢谢你让我知道你的关心。我确实清理了一些代码,但基本问题仍然存在。作为参考,我是基于我的代码编写的,它可以很好地工作,但只能用于after_uu而不是Abround_uu回调。我想你应该调用self.included
钩子中的Abround_u回调
。非常感谢!这对我很有用。一旦有人向我指出了这一点,就有点盲目地显而易见:)