从Rails设置document.domain的DRY方式

时间:2016-02-29 17:41:14

标签: javascript ruby-on-rails cors cross-domain

我有一个Rails应用程序正在使用两个想要用JavaScript进行通信的子域。什么是最有效地设置document.domain = mydomain.com的干燥方式?

使其不那么直接的条件

  1. 在域名为localhost的开发或测试环境中,这不应该是一个问题。
  2. 还需要在某些不加载主JavaScript文件的页面上设置
  3. 条件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];
      }
    })();
    

    TL;博士

    设置多个页面'document.domain使用Rails的干燥方法是什么?

1 个答案:

答案 0 :(得分:0)

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

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

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