【问题标题】:Evaluate code once the view is rendered in rails视图在 Rails 中呈现后评估代码
【发布时间】:2012-03-21 09:54:09
【问题描述】:

在 Rails 中,我构建了一种 cronjob,但是一旦在那里呈现视图,我想在处理的任务上像“signoff”一样运行一些代码。

我应该把代码放在哪里,以便它在处理的绝对结束时运行(一旦视图被渲染)

rails 如何处理 html 是否缓冲? (它会在呈现 HTML 时向用户刷新还是在呈现后刷新?)

【问题讨论】:

  • 是的,如果您在堆栈底部注入一个中间件,您将获取渲染结果。响应包含html。
  • 如何在控制器中实现它?在format.html 之后(如果它在那里 - 它并不总是出现在所有控制器中)
  • 此操作是否需要能够阻止渲染,还是管理性的?如果您不需要此代码来阻止视图呈现,您可以在控制器上使用after_filter...
  • 您的中间件可能仍会更改 html 输出,因此在控制器中这样做是有风险的。
  • cron 需要最后的 html 输出,它只是一个数字,例如 4000 处理 4000 个项目,一旦完成,它只需要在 db 中签核 4000 个项目已完成,但如果它超时..因此最后这样做的原因(它几乎不会超时,但它是一种安全措施)

标签: html ruby-on-rails ruby


【解决方案1】:

您可以将视图渲染为字符串,捕捉渲染时可能发生的任何超时,记录操作结果并返回字符串:

begin
  @elements = Element.find(:all)
  html = render_to_string
  # Store the result
  Result.create(:element_count => @elements.count)
rescue Timeout::Error
  # Store the result of the call as failed?
  Result.create(:element_count => 0)
end
send_data html, :disposition => 'inline', :type => 'text/html'

你可以做一些其他的事情来实现你的目标:

  1. 如果您需要执行的代码仅由您的 cron 作业触发,您可以使用 rake 任务而不是控制器操作。

  2. 您可以调用脚本向控制器发出请求,检查请求的输出,然后记录结果(可能通过调用控制器中的新操作)。

【讨论】:

    【解决方案2】:

    要从呈现的 HTML 中选择一个元素,您可以使用 javascript/JQuery 读取该值:

        $(document).ready(function() {  
            var completion = $('#items_processed').val();  
         });
    

    【讨论】:

    • 我将它作为 cron 任务运行,所以它的 wget 调用我不太确定它是否会处理 javascript。
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多