如何在js.erb文件中构造绝对URL?

时间:2014-03-27 01:01:26

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

我的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。我基本上尝试了同样的事情,我想避免添加特定的环境变量。

提前致谢!

3 个答案:

答案 0 :(得分:1)

好的,既然我理解了你的问题,我会按照......回答。

第一个选项:

编辑文件:

  • 配置/环境/ development.rb
  • 配置/环境/ test.rb
  • 配置/环境/ production.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 %>';

请记住,因为它是一个资产,它将在部署一次时进行预编译,并且将为每个请求提供缩小版本(因此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,您可能会发现它很有帮助。