2015-04-20 11 views
16

Tôi sắp sửa kéo tóc ra ... Tôi đã cố gắng kích hoạt CORS trong ứng dụng Rails này từ sáng và nó không hoạt động. Tôi đã thử sử dụng this, sử dụng Rack Cors Gem, this answerpost tất cả đều không thành công.Làm thế nào để kích hoạt CORS trong Rails 4 App

Ai đó có thể chỉ cho tôi đúng hướng không?

Dưới đây là js của tôi:

 var req = new XMLHttpRequest(); 

     if ('withCredentials' in req) { 
      // req.open('GET', "https://api.github.com/users/mralexgray/repos", true); 
      req.open('GET', "http://www.postcoder.lc/postcodes/" + value, true); 
      // Just like regular ol' XHR 
      req.onreadystatechange = function() { 
       if (req.readyState === 4) { 
        if (req.status >= 200 && req.status < 400) { 
         // JSON.parse(req.responseText) etc. 
         console.log(req.responseText); 
        } else { 
         // Handle error case 
        } 
       } 
      }; 
      req.send(); 
     } 

Khi tôi cố gắng url này (từ một khách hàng bên ngoài): https://api.github.com/users/mralexgray/repos mà làm việc ok, tôi giả sử vấn đề là với API Rails của tôi. Liệu tôi có sai?

EDIT: Hiện nay tôi có điều này trong bộ điều khiển của tôi:

skip_before_filter :verify_authenticity_token 
before_filter :cors_preflight_check 
after_filter :cors_set_access_control_headers 

# For all responses in this controller, return the CORS access control headers. 
def cors_set_access_control_headers 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Max-Age'] = "1728000" 
end 

# If this is a preflight OPTIONS request, then short-circuit the 
# request, return only the necessary headers and return an empty 
# text/plain. 

def cors_preflight_check 
    headers['Access-Control-Allow-Origin'] = '*' 
    headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS' 
    headers['Access-Control-Allow-Headers'] = 'X-Requested-With, X-Prototype-Version' 
    headers['Access-Control-Max-Age'] = '1728000' 
end 
+0

Tôi đã thử và nó đã không làm việc. Tôi thậm chí đã sử dụng ứng dụng ví dụ và vẫn không có may mắn – WagnerMatosUK

+1

bạn đã bao giờ có điều này để làm việc? Tôi có một front-end góc cạnh thực hiện cuộc gọi và tôi đã thử tất cả các giải pháp là tốt. Các đá quý giá cors không làm việc cho tôi. –

Trả lời

31

Bạn nên sử dụng rack cors

Nó cung cấp một DSL tốt đẹp, để sử dụng trong config/application.rb của bạn, thay vì công việc đầu lộn xộn và trước bộ lọc.

Rất dễ chấp nhận như sau, nhưng tất nhiên, bạn sẽ phải điều chỉnh nó một chút.

use Rack::Cors do 
    allow do 
    origins '*' 
    resource '*', headers: :any, methods: :any 
    end 
end 
+0

Bạn có nghĩa là 'config/application.rb'? – WagnerMatosUK

+0

Tôi không biết những gì 'nó didnt work' có nghĩa là :) Tôi sử dụng nó trong ứng dụng của tôi và nó chỉ là tốt. Bạn có nhiều thông tin hơn không? – apneadiving

+0

Ok, tính năng này hiện đang hoạt động trên Chrome. Tôi nghĩ vấn đề là loại quyền. Điều thú vị là nó không hoạt động trên FF hay Safari. Tôi đoán nó không có gì để làm với Rails nhưng bên JS của nó? – WagnerMatosUK

9

thêm vào Gemfile của bạn:

gem 'rack-cors' 

Thêm mã dưới đây để cấu hình/application.rb

# Rails 3/4 
config.middleware.insert_before 0, "Rack::Cors" do 
    allow do 
    origins '*' 
    resource '*', :headers => :any, :methods => :any 
    end 
end 
Các vấn đề liên quan