2

フロントエンドとバックエンドを分離する必要があります。バックエンドに Rails、フロントエンドに Backbone を使用しています。

数日間の試行錯誤の後、サーバーに CORS をセットアップすることができました。このモジュールのおかげです:

https://github.com/yaoweibin/nginx_cross_origin_module

Backbone はクロスドメイン コールをそのままではサポートしていないことがわかりました。

バックボーンをバックエンドから分離する最良の方法は何だろうか?

2 つの解決策があります。

1)サーバーを指すバックボーンモデル/コレクションにパスを記述します。たとえば、次のようになります。

class App.Collections.Plots extends Backbone.Collection
   model: App.Models.Plot
   url: 'http://www.app.com/api/plots'

これは、クロスドメインをサポートするためにバックボーン メソッドにもパッチを適用する必要があることを意味します。

2) バックボーンではなく、Rails がサーバーに対してクロスドメイン呼び出しを行うように、フロントエンド部分のレール側をセットアップします。バックボーンはデカップリングを容易にするはずだったので、これは奇妙に思えます。 Railsソリューションに戻るようなものです。

4

1 に答える 1

2

今、Backboneはすぐに使用できるクロスドメイン呼び出しをサポートしていないことがわかりました。

Backbone.jsはクロスドメイン呼び出しを「サポート」します。実際、これはbackbone.jsに固有のものではなく、それをサポートするブラウザーの役割です。CORS互換ブラウザでは、各リクエスト(POST、GET)の前にOPTIONSリクエストがあり、サーバーが対応するPOSTまたはGETリクエストを承認しているかどうかを確認します。

したがって、Railsアプリケーションでこの新しい呼び出しに応答する必要があります。例えば ​​:

class ApplicationController < ActionController::Base
  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
    if request.method == :options
      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'
      render :text => '', :content_type => 'text/plain'
    end
  end

end

この素晴らしい投稿からのコード:http ://www.tsheffler.com/blog/?p = 428

したがって、Nginxプラグインが正常に機能する場合は、問題ないはずです。Access-Control-Allow-OriginヘッダーにJavaScriptが実行されるドメインが含まれていることを確認してください。

于 2012-10-11T08:44:26.177 に答える