1

私はそれらをどのように使用するかを尋ねているのではなく、それらがどのように機能するかを尋ねています。私のコントローラー(私のコントローラーに足場ジェネレーターの1つを使用しただけ)にはメソッドがあります:

def index
  @users = User.all
end

そのメソッドから、リクエストで「html」を指定しなくても、html レスポンス (index.html.erb) を取得するか、json レスポンス (index.json.jbuilder) を取得できます。

他の方法にはと がformat.htmlありformat.jsonます。上記のメソッドの例indexでは、応答の「タイプ」への参照はありません。なぜ/どのように機能するのですか?!?

/users の要求-- 予想されるデフォルトの html

/users.html の要求-- 予想される html 応答

/users.js のリクエスト-- の html コンテンツが返されます<body>(おそらくそれは部分的なものでしょうか?)

.js 用に指定されたテンプレートがどこにもありません。

/users.txt の要求-- 予想されるエラー メッセージが表示されます。

Missing template users/index, application/index with {:locale=>[:en], :formats=>[:text], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder]}.

/users.xml の要求-- 主なリソースの .js ハンドラーよりも xml の方が実用的なように見えますが、予想されるエラー メッセージが表示されます。

Missing template users/index, application/index with {:locale=>[:en], :formats=>[:xml], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder]}

.abc の要求がまったく処理されないのはなぜですか? それがhtmlであることを示しているわけではありませんが、それが処理方法です。

Started GET "/users.abc" ...
Processing by UsersController#index as

:handlers が指定されていることがわかりますが、.js リクエストをどのように/何を処理するかを指定するものはありません。.js リクエストがエラーを吐き出さないのはなぜですか? 地獄、これはすべて Respond_to ブロックなしでどのように機能しますか? デフォルトで html ハンドラーを期待していると思いますが、デフォルトで .json 応答を期待していません。多くの場合、すべての種類の形式を返すことができるようにしたい場合があり、HTML よりも .json 応答のみを使用したい場合もあります。これに対処するためのドキュメントはどのように/どこで見つけることができますか? これは、respond_to ブロックとはあまり関係ありません。respond_to がなくても、複数の形式の出力が得られるからです。

4

2 に答える 2

4

コントローラでは、MIME タイプが定義されていない場合、Rails は単純にデフォルトのものをレンダリングします:

def index
  @users = User.all
end

と同等です

respond_to :html

def index
  @users = User.all
  respond_with @users
end

そうは言っても、他の MIME タイプを見てみましょう。

/users.js のリクエスト

これは興味深いものです。こちらの Rails コード ベースを見ると、以下を使用してテンプレートがレンダリングされることがわかりますdefault_render

# to_js simply tries to render a template. If no template is found, raises the error.
def to_js
  default_render
end

htmlこれは、 MIME タイプのデフォルトのケースでもあります。

# HTML format does not render the resource, it always attempt to render a
# template.
#
def to_html
  default_render
rescue ActionView::MissingTemplate => e
  # ...
end

それはどういう意味ですか?-- js テンプレートが定義されている場合、rails はそれをレンダリングします。それ以外の場合は、フォールバックしてデフォルトの HTML テンプレートをレンダリングします。これが、 の html コンテンツを取得する理由です<body>。あなたのapp/views/layouts/application.html.erbファイルを見てください:

<body>
  <%= yield %>
</body>

/users.txtリクエストと /users.xml のリクエスト

基本的に、すべての「デフォルトで未定義」の MIME タイプでは、例外をスローしないように何らかのロジックを定義する必要があります。レールソースから:

def respond
  method = "to_#{format}"
  respond_to?(method) ? send(method) : to_format
end

Rails はデフォルトto_htmlで と を定義しますto_jsその他の MIME タイプについては、次のメソッドの条件を満たす必要があります。jsonとの場合xml、単に を呼び出すto_jsonto_xmlまたは を使用することを意味しrespond_toます。

詳細については、こちらresponder.rbの rails source のファイルを参照してください。物事がどのように機能するかを本当に理解するために、レールのソースを見ることは常に良いことです。もちろん、時間を割いてメソッドやファイルを飛び回る必要がある場合もあります。

于 2013-08-10T08:52:03.703 に答える
-1

「reposnd_to」ブロックがないときにコントローラーのメソッドが JS 形式のリクエストを取得した場合、レールの反応がどうなるかはわかりませんが、「受け入れられない形式」というエラーで応答すると思います。したがって、デフォルトでは、リクエストはhtml形式であると想定されており、html以外に応答するには、respond_toフォーマットブロックで指摘する必要があると思います。

メカニズムがどのように機能するかについては、「クライアントから送信された HTTP Accept ヘッダーから目的の応答形式をレールが決定します」( https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/mime_responds .rb#L85 ) レール ソースは言う。そのため、MIME タイプでリクエストを生成する際に、受け入れられる形式が明示的に示されます。

于 2013-08-09T01:41:57.890 に答える