我的Rails应用程序中有一个js.erb文件,该文件将作为外部脚本包含在另一个站点中。我想定义一个变量来存储Rails资产路径的绝对URL(协议+主机+资产前缀),这样URL就像这样:
开发
var absURL = "http://localhost:3000/assets/";
分段
var absURL = "http://staging.foo.com/assets/";
PROD
var absURL = "http://foo.com/assets/";
我不太清楚如何做到这一点 - request
对象在这里不可用,资产路径助手只返回相对于根的路径。
一些建议是将URL传递给脚本或在端点上呈现JS,以便root_url
可用。理想情况下,上面有一个解决方案,但我对其他想法持开放态度。
修改:我确实看到了question。我基本上尝试了同样的事情,我想避免添加特定的环境变量。
提前致谢!
答案 0 :(得分:1)
好的,既然我理解了你的问题,我会按照......回答。
第一个选项:
编辑文件:
你必须像以下那样写主持人:
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 %>';
请记住,因为它是一个资产,它将在部署一次时进行预编译,并且将为每个请求提供缩小版本(因此ruby代码将在部署时执行)。
选项2:
您可以在 config / routes.rb 中添加您选择的路线,例如:
match 'my_js', to: 'home#my_js'
然后您可以在家庭控制器中创建一个视图: app / views / home / my_js.js.rb 并在那里添加ruby代码:
var absURL = '<%= root_url %>';
确保包含actionpack-page_caching gem以便为您的操作生成缓存,因此它会在第一次请求时编译,然后它将仅在所有其他请求上提供已编译的版本(尽管它不会缩小javascript,因此资产可能是更好的解决方案)
答案 1 :(得分:0)
您可以在包含javascript文件之前在视图中定义变量:
<%= javascript_tag("var absURL = '#{root_url}';") %>
然后在你的javascript文件中,你将拥有变量absURL,你可以通过尝试你的js文件来检查:
$(document).ready(function() {
alert(absURL);
});
答案 2 :(得分:0)
首先在您的视图中设置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,您可能会发现它很有帮助。