Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Angular2应用程序至Rails5后端的CORS问题_Ruby On Rails_Angularjs_Cors_Ruby On Rails 5 - Fatal编程技术网

Ruby on rails Angular2应用程序至Rails5后端的CORS问题

Ruby on rails Angular2应用程序至Rails5后端的CORS问题,ruby-on-rails,angularjs,cors,ruby-on-rails-5,Ruby On Rails,Angularjs,Cors,Ruby On Rails 5,从我记事起,我就一直在与CORS抗争,但我正在尝试一件非常简单的事情:C9上的3个微服务-所有3个不同端口,所以不是同一起源 在Rails中: 程序A-cors.rb-不工作 程序B-cors.rb有效 Angular2服务在这两个方面也非常相似(只更改名称),所以我只显示 程序即服务 import { Injectable } from '@angular/core' import { Http, Response, Headers, RequestOptions } from '@angul

从我记事起,我就一直在与CORS抗争,但我正在尝试一件非常简单的事情:C9上的3个微服务-所有3个不同端口,所以不是同一起源

在Rails中:

程序A-cors.rb
-不工作

程序B-cors.rb
有效

Angular2服务在这两个方面也非常相似(只更改名称),所以我只显示

程序即服务

import { Injectable } from '@angular/core'
import { Http, Response, Headers, RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Rx';

import { Document } from './document';

@Injectable()
export class DocumentService{
    private documentsUrl = "//freeland-camp-documents-dnorthrup.c9users.io/freelance_documents.json";

    constructor(
        private http: Http    
    ) {}

    getDocuments(): Observable<Document[]> {
        let headers = new Headers({ 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*' });
        let options = new RequestOptions({ headers: headers });
        return this.http.get(this.documentsUrl)
                        .map((response: Response) => <Document[]>response.json())
                        .catch(this.handleError);
    }

    private handleError (error: Response | any) {
        // In a real world app, we might use a remote logging infrastructure
        let errMsg: string;
        if (error instanceof Response) {
          const body = error.json() || '';
          const err = body.error || JSON.stringify(body);
          errMsg = `${error.status} - ${error.statusText || ''} ${err}`;
        } else {
          errMsg = error.message ? error.message : error.toString();
        }
        console.error(errMsg);
        return Observable.throw(errMsg);
    }
}
在控制台中-好像Rails认为它成功发生了(我假设这是因为Rails处于API模式,JSON总是呈现

我到底遗漏了什么?程序B最初在那里有真实的源URL,但仍然有效,将其更改为
*
并没有解决任何问题

根据我找到的Rails5文章,我还放置了:

config.action_dispatch.default_headers = {
  'Access-Control-Allow-Origin' => 'freeland-camp-documents-dnorthrup.c9users.io:8082',
  'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
在Application.rb中无效。欢迎任何见解-我没有主意。我尝试了Chrome的插件来绕过标题(无效),并使
程序A
工作,但中断了
程序B
说“origin evil.com不够用”。-当时我还没有*


欢迎任何意见。

对于遇到此问题的人:

我可以通过修改来解决我的问题
config/application.rb
包括:

config.action_dispatch.default_headers = {
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
config.action_dispatch.default_headers = {
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
是正确的解决方案-似乎我有点缓存问题。 我没有使用*作为源代码,而是使用调用它的确切域

最后,我需要
cors.rb
具有:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
    allow do
     origins '*'

     resource '*',
       headers: :any,
       methods: [:get, :post, :put, :patch, :delete, :options, :head]
    end
end
application.rb
具有

config.action_dispatch.default_headers = {
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}
Rails.application.config.middleware.insert_before 0, Rack::Cors do
    allow do
     origins '*'

     resource '*',
       headers: :any,
       methods: [:get, :post, :put, :patch, :delete, :options, :head]
    end
end
config.action_dispatch.default_headers = {
  'Access-Control-Allow-Origin' => '*',
  'Access-Control-Request-Method' => %w{GET POST OPTIONS}.join(",")
}