【问题标题】:Absolute URLs throughout application in Rails 3Rails 3 中整个应用程序的绝对 URL
【发布时间】:2011-05-14 04:19:53
【问题描述】:

对于问题的长度,我很抱歉,但我想总结一下到目前为止的知识,并尝试更快地找到正确的解决方案。

我有一个有时会嵌入到另一个网页的应用程序。为了简化解释,假设有一个服务器,它提供普通应用程序或用于嵌入的应用程序版本,具体取决于域名。

对于后一个域,应用程序使用link_to、product_url、image_tag等生成的链接应该是绝对的(http://servername/images/image_01.jpg),对于前者,它们应该是相对的(我认为,除非我不能优雅地解决这个问题)。

我知道我可以使用例如product_url(:id, [...], :host => request.host, :port => request.port) 生成绝对 URL,但我发现这种方法存在两个问题。首先,在每个视图的每个链接请求中重写此代码似乎效率低下。其次,当应用程序独立运行而不是嵌入时,我宁愿使用相对 URL 来提高效率和最佳实践。

对于静态资产,可以在 config/environments/whatever.rb 中执行以下操作: config.action_controller.asset_host = "http://assets.example.com"

但是,这不会影响 Rails 生成的链接。

这几天我一直在寻找答案,但没有任何最新的 Rails 3。这里有一段旧代码可以解决 Rails 2 的问题:

http://opensoul.org/2009/2/21/force-absolute-urls

但它似乎不适用于 Rails 3。所以...

  1. 我是否应该创建一些辅助函数来检测链接是否将被嵌入?
  2. 修补 url_for 以使其按我想要的方式工作,而无需更改应用程序视图?
  3. 还是重写我所有的视图文件?

提前感谢任何回复。

干杯,

泽夫

【问题讨论】:

    标签: ruby-on-rails url ruby-on-rails-3 absolute


    【解决方案1】:

    我已经搜索了资源,似乎 Rails 3.0 不支持将其设置为默认值。我可能会去打猴子补丁url_for,除非你有充分的理由不这样做。

    有一个选项:only_path,如果您将其设置为默认 true 或基于域的默认值。目前它默认存在:host 选项。这个补丁可能会破坏一些编码不太好的插件,请确保你测试它们。

    【讨论】:

    • 谢谢,是的,我忘了提到:only_path,但更多属于“重写我所有的视图文件”。现在我认为不幸的是这可能是最好的方法。如果 rails 3.0.3 是我必须使用的最后一个版本,修补它可能会奏效,但是...
    • 我会用def url_for(options);super(options.reverse_merge! :only_path => false);end 之类的东西来修补它,这应该是相对未来的证明。
    • 与“合并!”而不是 reverse_merge,因为我们希望覆盖选项哈希。但是,是的,我认为你是对的,再次感谢。
    • 如果您使用反向合并,它会让您在需要时手动覆盖,但仍会默认为您需要的。
    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 2019-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多