これは、Railsヘルパーメソッドを利用するRubyコードのブロックです。まだブロックに慣れていない場合は、Rubyでよく見かけます。
respond_to
は、コントローラクラス(または、そのスーパークラス)にアタッチされているRailsヘルパーメソッドです。ビュー(ブラウザーに送信される)に送信される応答を参照しています。
この例のブロックは、ブラウザがhtmlまたはjsonデータを要求するたびにコントローラーからビューに送信される、データのフォーマット(ブロックの「フォーマット」パラメーターを渡すことによる)です。
ローカルマシン上にあり、Postスキャフォールドを設定している場合は、そこに移動するhttp://localhost:3000/posts
と、すべての投稿がHTML形式で表示されます。ただし、次のように入力 http://localhost:3000/posts.json
すると、サーバーから送信されたjsonオブジェクトにすべての投稿が表示されます。
これは、サーバーとの間でjsonをやり取りする必要があるJavaScriptの重いアプリケーションを作成するのに非常に便利です。必要に応じて、Railsバックエンドにjson apiを簡単に作成し、Postコントローラーのインデックスビューのような1つのビューのみを渡すことができます。次に、JqueryやBackbone(またはその両方)などのJavaScriptライブラリを使用して、データを操作し、独自のインターフェースを作成できます。これらは非同期UIと呼ばれ、非常に人気が高まっています(Gmailもその1つです)。それらは非常に高速で、エンドユーザーにWebでデスクトップのようなエクスペリエンスを提供します。もちろん、これはデータをフォーマットする利点の1つにすぎません。
これを書くRails 3の方法はこれだろう:
class PostsController < ApplicationController
# GET /posts
# GET /posts.xml
respond_to :html, :xml, :json
def index
@posts = Post.all
respond_with(@posts)
end
#
# All your other REST methods
#
end
respond_to :html, :xml, :json
クラスの先頭に置くことで、コントローラーがビューに送信するすべてのフォーマットを宣言できます。
次に、コントローラメソッドでは、respond_with(@whatever_object_you_have)を実行するだけです。
Railsが自動生成するものよりもコードを単純化するだけです。
これの内部の仕組みについて知りたいなら ...
Railsは私が理解していることから、オブジェクトをイントロスペクトして、実際のフォーマットがどうなるかを判断します。'format'変数の値は、このイントロスペクションに基づいています。Railsは少しの情報で多くのことができます。単純な@postまたは:postがどこまで続くかに驚くでしょう。
たとえば、次のような_user.html.erb部分ファイルがあるとします。
_user.html.erb
<li>
<%= link_to user.name, user %>
</li>
次に、これを私のインデックスビューで単独で使用すると、「users」パーシャルを検索し、すべての「users」オブジェクトを反復処理する必要があることがRailsに通知されます。
index.html.erb
<ul class="users">
<%= render @users %>
</ul>
Railsに、 'user'パーシャルを見つけて、すべての 'users'オブジェクトを反復処理する必要があることを知らせます。
あなたはこのブログ投稿が役に立つと思うかもしれません:http : //archives.ryandaigle.com/articles/2009/8/6/what-s-new-in-edge-rails-cleaner-restful-controllers-w-respond_with
ソースを閲覧することもできます:https : //github.com/rails/rails