6

Rails 3.2 と Backbone.js で pushState オプションを使用してシングル ページ アプリを作成しようとしましたが、理解できない問題に直面しました。

アプリのルート URL (/) を読み込むと、すべてがうまくいきます。Rails は、JSON エンティティ用の XHR を作成してコンテンツをレンダリングするバックボーンをブートストラップする JS を含む HTML レイアウトを返します。

しかし、ルート以外の URLからアプリの使用を開始すると(たとえば、ブラウザーのアドレス バーに手動で入力することによって)、Rails は、routes.rb のルーティング ルールを使用してこの要求を処理しようとします。これは間違っています。これは「バックボーンの」ルートだからです。 . その場合、この URL を処理するためにページとブートストラップ バックボーンをロードするにはどうすればよいですか?

4

3 に答える 3

14

ついに私は解決策を見つけました。

次のコードをroutes.rbに追加しました

class XHRConstraint
  def matches?(request)
    !request.xhr? && !(request.url =~ /\.json$/ && ::Rails.env == 'development')
  end
end

match '(*url)' => 'home#index', :constraints => XHRConstraint.new

このマッチャーを使用すると、XHR以外のすべてのリクエストがHomeControllerにルーティングされ、HTMLページが返されます。また、XHRリクエストは、JSONレスポンスを返す他のコントローラーによって処理されます。また、「。json」で終わるリクエストは、デバッグ用の開発環境で有効なものとして残しました。

于 2012-08-23T21:25:18.970 に答える
1

手動で変更した場合、バックボーンには URL の変更が通知されません。この変更はブラウザによってキャッチされ、通常どおりリクエストをサーバーに送信します。

通常のリンクhrefをクリックした場合と同様に、バックボーンに通知せずにそのリンクをたどります。

バックボーンに URL の変更を任せたい場合は、利用可能なバックボーン ツールを使用してそれを行う必要があります。これは独自のルーターです。

したがって、バックボーンの方法で URL を変更したい場合は、次のように明示的に変更する必要があります。

app.router.navigate("my/route", {trigger: true});
于 2012-08-23T11:00:14.273 に答える
1

これはややトリッキーな問題ですが、基本的には、レール内のすべての有効な (HTML) リクエストに同じ (ルート) ページで応答する必要があります。そこから、バックボーンが引き継ぎ、正しいルート ハンドラーにルーティングします (バックボーン ルータ)。

この問題については、こちらで詳しく説明しました: rails and backbone working together

基本的に私がしていることは、処理したいすべてのページと空白のビューに対してアクションを作成することです。私はページを返すために使用します (どちらの場合も同じです) 。HTML 要求に対してのみrespond_withGET アクションを処理するため、コントローラーの上部に次の行を追加します。

respond_to :html, :only => [ :show, :new ]

JSON リクエストも同様に処理されますが、HTML リクエストとは異なり、リクエストされたリソースが実際に返されます (およびの場合は、respond_withリクエストされたアクションが実行されます)。PUTPOSTDELETE

于 2012-08-22T23:19:26.200 に答える