【问题标题】:In Rails how can I get the contents of a page without making an HTTP request?在 Rails 中,如何在不发出 HTTP 请求的情况下获取页面内容?
【发布时间】:2010-01-11 14:00:09
【问题描述】:

这可能真的很明显,但是在 Rails 中我如何在不发出 HTTP 请求的情况下获取页面内容?

即我想在同一服务器上的脚本中获取我的 rails 应用程序生成的任何页面的内容。这对于 HTTP 请求来说当然是微不足道的,但是我怎样才能获取页面的内容呢?

这就是我现在正在做的,效果很好:

require 'open-uri'

contents = open("http://localhost/path_to_my_page").read # but I really want to get rid of the overhead of the HTTP request

我需要能够从脚本中执行此操作,在 rails 应用程序中,而不是控制器(例如使用 render_to_string)

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    这是您在控制台中获取页面内容的方式。它可能对你有用:

    require 'action_controller/integration'
    app = ActionController::Integration::Session.new;
    app.get('/path_to_your_page')
    puts app.response.body
    

    【讨论】:

    • 它模拟一个 http 请求,以便设置控制器所需的所有环境。它实际上并不像您的版本那样从“外部”向您的服务器发出请求。例如,如果您的服务器没有运行,它仍然可以工作。
    • 好的,我得仔细看看这个,谢谢你的耐心。
    • 嗯...我使用的是 Rails 2.3.4,而我的第二个 app.get 抛出了“ThreadError:仅停止线程”错误。有什么想法吗?
    • 嗯,是的。在修复此错误之前,您似乎无法这样做:rails.lighthouseapp.com/projects/8994/tickets/3153
    • 好的,通过在您的链接上手动应用补丁来解决这个问题。
    【解决方案2】:

    在您的控制器中,您可以调用 render_to_string 而不是 render 并且返回页面而不是发送到浏览器。
    两个方法的参数是一样的,所以你需要指定你需要渲染哪个控制器和动作。

    【讨论】:

    • 谢谢,但我需要从单独的脚本中完成,而不是在控制器中。
    • 从脚本中您可以直接使用 erb(如 flyfish64 的答案中所建议的那样),但是您需要手动初始化您在视图中使用的所有变量,因为您没有使用控制器来填写变量。
    • 是的,但我的控制器已经这样做了;我不想重新发明我已经拥有的东西
    【解决方案3】:

    为什么不直接使用erb呢?详情请见this question

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多