1

Rails 2.3.5 を実行しているアプリがあり、そのほとんどに JSON API があります。

請負業者が来て、アプリでいくつかの作業を行い、いくつかの場所で RJS を使用しました。メイン Web サイトに RJS を使用しているコントローラー アクションの一部も、API の一部である必要があります。

問題は、JSON API 要求が RJS 応答をトリガーすることです。これは私が望んでいるものではありません。RJS 応答がブラウザーから発生するようにしたいのですが、それが API 要求の場合 ("application/json" Accept および Content-Type ヘッダーを使用することで区別されます)、API 応答を送信するだけにしたいと考えています。

私が知る限り、Rails は javascript を含むすべての MIME タイプに対して RJS レスポンスをトリガーします。

テキスト/javascript アプリケーション/json

RJS に text/javascript のみに応答させる方法はありますか? または、この問題を解決するためのより良い方法はありますか?

より明確にするために、次のようなコードがあります。

def show
  @dashboard = @user.dashboard
  respond_to do |wants|
    wants.html
    wants.json { render :json => @dashboard }
  end
end

問題は、このコントローラーのビュー フォルダーに show.rjs テンプレートもあるということです。誰かが API にアクセスすると、上記のように json の結果をレンダリングする必要がありますが、代わりに show.rjs テンプレートをレンダリングします。

API クライアントが必要な json の結果を確実に取得できるようにするにはどうすればよいですか?

4

3 に答える 3

1

mime_types.rb で json を定義する必要があり、これを実行できるはずです。

def show 
  @dashboard = @user.dashboard
  respond_to do |format|
    format.html
    format.json {render :json => @dashboard}
    format.js
  end
end

詳細はこちら: http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/

于 2010-03-03T15:12:39.560 に答える
0

コントローラのアクションで、次のことを試してください。

def index
  respond_to do |format|
    format.html # Renders index.html.erb as usual
    format.xml  { render :json => {:name => "raskchanky"}.to_json }
  end
end

Railsのドキュメント(http://api.rubyonrails.org/classes/ActionController/Base.html)によると、「render:json」は応答のコンテンツタイプをapplication/jsonに設定します。

于 2010-02-26T20:29:30.983 に答える
0

JavaScript が正しいヘッダーを送信していると確信していますか? rjs を実行するときは、通常、format.js に応答して実行します。これにより、json と js の応答を簡単に分離できます。

一般的に、私の問題は、私の ajax アクションが実際に適切な形式でリクエストを送信していることを確認することでした。不明な場合は、'format':'js' パラメータをリクエストに追加できます。jQuery の場合:

// try to get it to figure out rjs actions by itself
$('a').click(function(e){
  e.preventDefault();
  $.get({
    url: this.attr('href'),
    dataType: 'script',
    success: responseFunction
  });
});

// or force the format
$('a').click(function(e){
  e.preventDefault();
  $.get({
    url: this.attr('href'),
    data: {format: 'js'},
    success: responseFunction
  });
});
于 2010-06-30T17:18:23.887 に答える