我的 Rails 应用程序中有一个 js.erb 文件,该文件将被另一个站点作为外部脚本包含进来。我想定义一个变量来存储 Rails Assets 路径的绝对 URL(协议(protocol) + 主机 + Assets 前缀),使得 URL 看起来像这样:
开发
var absURL = "http://localhost:3000/assets/";
分期
var absURL = "http://staging.foo.com/assets/";
产品
var absURL = "http://foo.com/assets/";
我不太确定如何执行此操作 - request
对象在此处不可用,并且 Assets 路径助手仅返回相对于根的路径。
一些建议是将 URL 传递给脚本或在端点上渲染 JS,以便 root_url
可用。理想情况下,上述问题有一个解决方案,但我对其他想法持开放态度。
编辑:我确实看到了这个 question 。我基本上正在尝试同样的事情,但是我想避免添加特定的环境变量。
提前致谢!
最佳答案
好吧,现在我明白了你的问题,我会根据......来回答......
第一个选项:
编辑您的文件:
- config/environments/development.rb
- config/environments/test.rb
- 配置/环境/生产.rb
你必须这样写主机:
default_url_options[:host] = 'www.example.com'
然后你可以在你的资源中创建一个javascript,例如app/assets/javascript/test.js.erb,确保添加.erb扩展名,以便在编译javascript时首先执行ruby代码并添加代码:
<% environment.context_class.instance_eval { include Rails.application.routes.url_helpers } %>
var absURL = '<%= root_url %>';
请记住,因为它是一个 Assets ,所以在部署一次时就会对其进行预编译,并且将为每个请求提供缩小版本(因此 ruby 代码将在部署时执行)。
选项 2:
您可以在config/routes.rb中添加您选择的路线,例如:
match 'my_js', to: 'home#my_js'
然后您可以在主 Controller 中创建一个 View :app/views/home/my_js.js.rb 并在此处添加 ruby 代码:
var absURL = '<%= root_url %>';
请务必包含 actionpack-page_caching gem为了为您的操作生成缓存,因此它会在第一个请求时进行编译,然后它将仅在所有其他请求上提供编译后的版本(尽管它不会缩小 JavaScript,因此 Assets 可能是更好的解决方案)
关于javascript - 如何在 js.erb 文件中构造绝对 URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676277/