2011-09-01 37 views
1

这是Rails 2.3.10和Ruby 1.8。Rails 2.3:在执行after_filter之前立即重定向

我有一些代码,看起来大致是这样的:

class RedirectingController 
    after_filter :do_something_long, :only => [:show] 
    def show 
    redirect_to "http://www.google.com" 
    end 

    def do_something_long 
    sleep 60 
    logger.debug("Something long has completed") 
    end 
end 

现在我的问题是,即使我在重定向已被执行的日志中看到,它等待,直到睡眠60前完成重定向实际上发生了。有没有办法让重定向发送到浏览器,然后运行do_something_long。作为一个附注,我试图避免使用诸如delayed_job或resque之类的东西。

回答

0

类似于delayed_job或resque的设计旨在启动并完成长时间运行的后台任务,而不是让用户等待它完成(并冻结ui)。这项任务需要多长时间?如果它以毫秒为单位完成,那么大多数人可能都不会注意到,但如果花费的时间比您需要的时间长,则应该深入研究delayed_job。你有一个令人信服的理由或挂断,为什么你不能?

+0

我给一些背景:这是被击中会通过一个非常大的用户量被击中的动作。所有的动作都是重定向(想一想粗略的比喻),但是有一些计算需要发生,我不想增加重定向的时间,最多只需要0.5s。 – Mike

+0

好的。是否有一个令人信服的理由,您可以使用延迟工作?这似乎是一个相当不错的用例。他们开始行动,你开始耽误工作,而且他们快速闪电。 – Msencenb

+0

如果我不得不使用delayed_job,我会这样做,但是与仅刷新输出,重定向浏览器,然后执行计算相比,这看起来会有很大的开销。我也担心数据库中写入delayed_job的数据量会在数据库中创建可能会影响网站的其他部分。 – Mike

0

你可以做这样的事情:

def do_something_long 
    Thread.new do 
    sleep 60 
    logger.debug("Something long has completed") 
    end 
end 

How to run a very small amount of code asynchronously?

+0

我试着做一个thread.new块来做计算,但我得到一个零对象异常,而在单线程模式下它没有问题。在控制器操作中使用线程是否存在已知问题? – Mike