我有一个Rails应用程序,它使用两个子域,希望用JavaScript进行通信。有效设置document.domain = mydomain.com
的最干燥方法是什么?
使它不那么简单的条件
- 在域
localhost
的开发或测试环境中,这应该不是问题。 - 这也需要在未加载主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