渲染后如何调用方法?

时间:2015-10-20 15:32:19

标签: ruby-on-rails ruby ruby-on-rails-4

我需要在渲染页面后对远程服务做请求

我的控制器:

after_filter :remote_action, only: :update

def update
  @res = MyService.do_action foo, bar
  return render json: @res[:json], status: @res[:status] unless @res[:success]
end

def remote_action
  # There is remote http request
end

我需要在渲染页面后调用remote_action方法

1 个答案:

答案 0 :(得分:10)

after_filter在模板转换为html后运行,但之前 html作为对客户端的响应发送。因此,如果您正在做一些像制作远程http请求那样慢的事情,那么这会降低您的响应速度,因为它需要等待远程请求完成:换句话说,远程请求将阻止您的响应。

为了避免阻塞,你可以分叉另一个线程:看看

https://github.com/tra/spawnling

使用此功能,您只需将代码更改为

即可
def remote_action
  Spawnling.new do
    # There is remote http request
  end
end

在回复响应之前仍会触发远程调用,但由于它已被分叉到新线程中,响应不会等待远程请求返回,它将会马上发生。

您还可以查看https://github.com/collectiveidea/delayed_job,它将作业放入数据库表,其中一个单独的进程将它们拉出并执行它们。