如何在控制器操作中向Rails动态添加后置过滤器?

时间:2012-03-29 06:32:12

标签: ruby-on-rails ruby controller metaprogramming

每次用户访问我的Rails应用程序中的页面时,数据库都需要向他们发送Thingy。当数据库耗尽Thingies时,它必须进行一些昂贵的处理才能生成更多。我想动态添加一个控制器过滤器,以便在将响应发送给用户之后生成,这样它就不会影响页面加载时间。这是我的控制器的样子:

class ThingyController < ApplicationController

  def get_a_thingy
    if Thingy.count <= 5 
      # Only five thingies left! we need to generate some more. 
      # I want to dynamically send a block to an after_filter: here to  
      # generate thingies after the controller sends the response  
      # because generating thingies is really slow
    end

    # Pop the first thingy from the database and return
    thingy = Thingy.first
    thingy.delete 
    return thingy.content
  end

我可以在get_a_thingy函数中添加什么来实现这一目标?

3 个答案:

答案 0 :(得分:1)

您可以尝试一些后台处理工具(https://www.ruby-toolbox.com/categories/Background_Jobs检查一下),因为我不确定您是否可以在请求处理程序中执行此操作。

您也可以尝试将所有内容返回给用户(通过像http流媒体这样的内容),然后才能做出沉重的事情。

答案 1 :(得分:0)

只需添加if语句,检查after_filter代码中的内容数量:

class ThingyController < ApplicationController
  after_filter :generate_new_thingies

  def get_a_thingy
    thingy = Thingy.first
    thingy.delete
    return thingy.content
  end

  def generate_new_thingies
    if Thingy.count <= 5
      # Generate thingies
    end
  end
end

使用after_filter是否真的可以防止长页面加载?最好看看Delayed JobWhenever等内容。

答案 2 :(得分:0)

对于像delayed_job这样的宝石来说,最好的想法可能还有一个railscast

延迟作业是异步优先级队列系统。

  • 安装并设置delayed_job。 github page上有很好的文档记录。

  • 使用rake jobs:work

  • 启动工作人员
  • 现在只需添加.delay方法

  • 即可更改代码以使用延迟作业
class ThingyController < ApplicationController
  after_filter :generate_thingies
  .
  .
  .
  def generate_thingies
    if Thingy.count <= 5
      #change
      Thingy.generate_thingies
      #to
      Thingy.delay.generate_thingies
    end
  end
end

注意:这是一个小教程,我遗漏了一些你需要它才能使它工作的东西。我建议您查看Github页面以获取完整的文档。