从 Rails 设置 document.domain 的 DRY 方法



我有一个Rails应用程序,它使用两个子域,希望用JavaScript进行通信。有效设置document.domain = mydomain.com的最干燥方法是什么?

使它不那么简单的条件

  1. 在域localhost的开发或测试环境中,这应该不是问题。
  2. 这也需要在未加载主JavaScript文件的某些页面上进行设置

条件1让我认为我要么想依赖一个正则表达式来解析location.host根域,要么在erb中进行切换。

条件2让我觉得最好写一次,把它放在资产管道中,并在必要时包含它。

最佳潜在解决方案

创建一个类似domain_setter.js.erb的文件(内容如下),将其添加到预编译列表中,并将其包含在所有必要的位置(\= require domain_setter清单中或javascript_include_tag 'domain_setter'没有清单的页面)。

<%- if Rails.env.production? %>
  document.domain = 'mydomain.com';
<%- end %>

更新的当前解决方案

此解决方案更加动态,不需要对域进行硬编码。仍然不是最好的,但它正在工作...主要是 :-/

(function() {
  var domain = /^(?:https?://)?.*?([^.]+.[^.]+?)(?::d+)?$/.exec(location.host);
  if (domain == null) {
    document.domain = 'localhost';
  } else {
    document.domain = domain[1];
  }
})();

博士

在使用

Rails 时设置多个页面document.domain的 DRY 方法是什么?

我认为

您正在寻找跨源资源共享(CORS)。这允许javascript跨不同域发出AJAX $.get/post请求。

这里有一个 rails 库可以帮助您入门: https://github.com/cyu/rack-cors#rails

您需要将origins属性设置为yoursubdomain.herokuapp.com

最新更新