【问题标题】:How do I construct an absolute URL in a js.erb file?如何在 js.erb 文件中构造绝对 URL?
【发布时间】:2014-03-27 01:01:26
【问题描述】:

我的 Rails 应用程序中有一个 js.erb 文件,该文件将作为 外部脚本 包含在另一个站点中。我想定义一个变量来存储 Rails 资产路径的绝对 URL(协议 + 主机 + 资产前缀),使 URL 看起来像这样:

开发

var absURL = "http://localhost:3000/assets/";

分期

var absURL = "http://staging.foo.com/assets/";

产品

var absURL = "http://foo.com/assets/";

我不太确定如何执行此操作 - request 对象在此处不​​可用,资产路径帮助程序仅返回相对于根的路径。

一些建议是将 URL 传递给脚本或在端点上呈现 JS,以便root_url 可用。理想情况下,上述问题有一个解决方案,但我对其他想法持开放态度。

编辑:我确实看到了这个question。我基本上是在尝试同样的事情,但是我想避免添加特定的环境变量。

提前致谢!

【问题讨论】:

    标签: javascript ruby-on-rails ruby-on-rails-3.2


    【解决方案1】:

    好的,既然我明白了你的问题,我会照着回答......

    第一个选项:

    编辑您的文件:

    • config/environments/development.rb
    • config/environments/test.rb
    • config/environments/production.rb

    你必须写这样的主机:

    default_url_options[:host] = 'www.example.com'

    然后您可以在 app/assets/javascript/test.js.erb 等资产中创建 javascript,确保添加 .erb 扩展名,以便在编译 javascript 时首先执行 ruby​​ 代码并添加代码:

    <% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>
    var absURL = '<%= root_url %>';
    

    请记住,由于它是一项资产,因此在部署一次时将进行预编译,并且将为每个请求提供缩小版本(因此 ruby​​ 代码将仅在部署时执行)。


    选项 2:

    您可以在 config/routes.rb 中添加您选择的路线,例如:

    match 'my_js', to: 'home#my_js'
    

    然后你可以在你的 home 控制器中创建一个视图:app/views/home/my_js.js.rb 并在此处添加 ruby​​ 代码:

    var absURL = '<%= root_url %>';
    

    确保包含actionpack-page_caching gem 以便为您的操作生成缓存,因此它会在第一次请求时编译,然后它只会在所有其他请求上提供编译后的版本(尽管它不会缩小javascript,因此资产可能是更好的解决方案)

    【讨论】:

    • 我认为你是对的。除了将它们硬编码到文件中之外,我认为这些是我唯一的选择。谢谢!
    【解决方案2】:

    首先在你的视图中设置hostURL变量

    #application.html.erb
    <script>
       window.hostURL = "<%=j request.original_url %>";
    </script>
    

    现在您可以在 javascript 文件中使用 hostURL 变量,但在使用该变量之前,请确保 DOM 已加载

    #script.js
    $(document).ready(function() {
      var absURL = host_url + 'assets/';
      alert(absURL);
    })
    

    希望对你有帮助

    编辑

    还可以看看 gon gem https://github.com/gazay/gon ,你可能会发现它很有帮助。

    【讨论】:

    • 谢谢。如果我找不到直接在 JS 文件中使用它的方法,这可能会作为替代方法。
    【解决方案3】:

    您可以在包含 javascript 文件之前在视图中定义变量:

    <%= javascript_tag("var absURL = '#{root_url}';") %>
    

    然后在您的 javascript 文件中,您将拥有变量 absURL,您可以通过尝试您的 js 文件来检查:

    $(document).ready(function() {
      alert(absURL);
    });
    

    【讨论】:

    • root_path 只给我/
    • 抱歉,澄清一下,我目前的假设是包含此 JS 的网站不会将 URL 传递给脚本。
    • 对不起,我想输入 root_url :) 你能用用例更新这个问题吗?我的意思是,第三方网站将包含您的 javascript 文件?您的网站将包含第三方 javascript 文件?
    • 已更新。感谢您要求澄清。希望它更清楚。
    猜你喜欢
    • 2011-11-20
    • 2019-03-14
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多