Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails &引用;“未给出块”;以编程方式定义调用时_Ruby On Rails_Ruby_Activerecord - Fatal编程技术网

Ruby on rails &引用;“未给出块”;以编程方式定义调用时

Ruby on rails &引用;“未给出块”;以编程方式定义调用时,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,我正在尝试编写一个库,该库将通过编程方式向ActiveRecord模型添加around\u update/around\u destroy回调 因此,常规模型如下所示,并按预期工作: class用户

我正在尝试编写一个库,该库将通过编程方式向ActiveRecord模型添加
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创建回调的用户模型的第二个版本 需要“皮德尔/皮德尔” 类用户 在我看到的输出中

更新的时间线 LocalJumpError:未提供块(产量) from/vagrant/lib/piddle/piddle.rb:13:in'block in timeline_for'
第一个输出行指示正在调用该方法,但未传入该块


有什么想法或替代方案吗?

如果你想定义这样的东西。了解主动支持关注点

我认为您需要在类上调用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回调
。非常感谢!这对我很有用。一旦有人向我指出了这一点,就有点盲目地显而易见:)