0

環境

  • レール 3.2.6
  • ルビー 1.9.3p194

私が見つけたもの

class ThemesController < ApplicationController
  def show
  end
end

/views/themes/show.html.erbこの設定では、URL 拡張子に関係なく、常にページがレンダリングされます。例えば:

http://localhost/themes/1.json
http://localhost/themes/1.xxx
http://localhost/themes/1.custom_ext
...

出会い

render :json=>@theme拡張子が の場合に実行し、それ以外の場合はページjsonをレンダリングしたいshow.html.erbので、コードを変更しました。

respond_to do |format|
  format.json { render :json => @theme}
  format.any {render}
end

render :json=>@themeURL 拡張子が の場合 に正しく実行され、、 など.jsonでレンダリングshow.html.erbされます。.xml.html

ただし、、406 Not Acceptable、に入りましたが、サポートされている MIME タイプしか許可されていないことが原因であることがわかりました。.xxx.ooo.custom_ext

一時的な解決策

class ThemesController < ApplicationController
  def show
    if params[:format].present? && params[:format] == "json"
      render :json => @theme
    end
  end
end

.xml.json、などの 2 つ以上の形式を提供する場合は、正常に動作します.yaml

class ThemesController < ApplicationController
  def show
    case params[:format]
    when "json" then render :json => @theme
    when "xml" then render :xml => @theme
    ...
    else render
    end
  end
end

respond_toそれはきれいに見え、スタイルより悪くはありません:D

質問

  1. 別のより良い解決策があるかどうか疑問に思っていますか?
  2. caseステートメントができることはすべてrespond_toできるが、できない場合respond_to、なぜ使用する必要があるのrespond_toですか?
4

1 に答える 1

2

よくあることですが、非常に便利なものはAPI docsにあります。

そこのメモに注意してください: Rails に付属しているため、csv MIME タイプに Mime::CSV を使用したことに注意してください。カスタム レンダラーの場合、Mime::Type.register で MIME タイプを登録する必要があります。

これを config/initializers/mime_types.rb に入れる必要があります。デフォルト以外のタイプを登録する例はほとんどありません。

定義済みの型はこちらです。

于 2012-06-18T06:23:51.037 に答える