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

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

我的 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/

相关文章:

ruby-on-rails - 如何使用 RSpec 测试 rake 任务?

javascript - Javascript 类中的 Promise 和 nightJS

javascript - 匿名函数中的函数作用域

javascript - 是否可以创建没有初始值的 BehaviourSubject<void>() ?

ruby-on-rails-3.2 - 在 Rails 中,针对两种情况执行 block : first_or_create

ruby-on-rails - 尝试设置 Rails 以将 session 存储在 Postgresql 数据库中

javascript - JS获取生成的textnode的值

ruby-on-rails - 有没有办法阻止 Rails 的内置服务器默认监听 0.0.0.0?

ruby-on-rails - Rails Controller 跳过 after_action

ruby-on-rails - 嵌套属性不允许的参数