微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby – 在Sinatra的Rufus调度程序

我在Sinatra应用程序中使用Rufus调度程序.
我可以从“scheduler do”块中访问辅助方法吗?我没有设法做到这一点(我得到一个“未定义的方法`检查’为main:Object”错误)所以现在我必须在helpers块中定义方法(在“post”/“do”块中使用它也)然后将方法的主体复制到调度程序块.它没有意义:(有没有办法避免重复?我可以在其他地方定义一个方法并在调度程序中调用它吗?

解决方法

这取决于您的调度程序的使用位置.一个块可以访问它本地的上下文,所以如果你在某个地方使用它,你可以访问一个帮助器,那么它也应该可以访问帮助器.

部分取自the docs

class MyApp < Sinatra::Base
  # hey,I'm in the application scope!

  helpers do
    def my_helper
    end
  end

  configure do
    scheduler.every('20s') do
      # my_helper is ***not*** accessible here
    end
  end

  get '/define_route/:name' do
    # Request scope for '/define_route/:name'
    scheduler.every('20s') do
      my_helper
      # my_helper is accessible here
    end
  end
end

话虽如此,您将无法访问这样的调度程序,因此:

configure do
  set :scheduler,{ Rufus::Scheduler.start_new }
end

然后你就可以做到

get '/define_route/:name' do
    # Request scope for '/define_route/:name'
    settings.scheduler.every('20s') do
      my_helper
      # my_helper is accessible here
    end
  end

或者你可以将它放在模块的类实例变量中:

module MyScheduler
  def self.scheduler
    @scheduler ||= Rufus::Scheduler.start_new
  end
end

然后您可以通过以下方式访问调度程序:

MyScheduler.scheduler

但my_helper仍然只能在请求范围内访问.如果要将方法作为帮助程序访问并在请求范围之外,则将其提取为jmettraux隐含于:

module MyHelpers
  def self.my_helper
    # do something
  end
end

在西纳特拉:

helpers
  def my_helper
    MyHelpers.my_helper
  end
end

那么可以做到:

configure do
  scheduler = Rufus::Scheduler.start_new
  set :scheduler,scheduler
  scheduler.every('20s') do
    MyHelpers.my_helper
    # my_helper is not accessible here
    # but the MyHelpers.my_helper is,because it's accessible everywhere
  end
end

# and/or

get "another-route" do
  setting.scheduler.every('20s') do
    my_helper
    # my_helper is accessible here
  end
end

一切都非常复杂!您可以混合搭配,找到适合您需求的产品.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐