Rails:respond_toブロックはどのように機能しますか?



Rails How Does Respond_to Block Work



解決:

私はRubyを初めて使用し、この同じコードで立ち往生しました。私がハングアップした部分は、ここで見つけたいくつかの答えよりも少し基本的でした。これは誰かを助けるかもしれないし、助けないかもしれません。

  • response_toはスーパークラスのメソッドですActionController。
  • デリゲートのようなブロックが必要です。ブロックはからですまで行う終わり、|フォーマット|ブロックへの引数として。
  • response_toはブロックを実行し、レスポンダーをに渡しますフォーマット引数。

http://api.rubyonrails.org/v4.1/classes/ActionController/Responder.html



  • NSレスポンダーには、のメソッドが含まれていません.htmlまたは.jsonですが、とにかくこれらのメソッドを呼び出します!この部分は私をループに投げ込んだ。
  • Rubyにはという機能がありますmethod_missing。存在しないメソッドを呼び出す場合(jsonまたはhtml)、Rubyは代わりにmethod_missingメソッド。

http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html

  • NSレスポンダークラスは一種の登録としてのmethod_missing。 'json'を呼び出すときは、jsonにシリアル化することで、拡張子が.jsonのリクエストに応答するように指示しています。電話する必要がありますデフォルトの方法で.htmlリクエストを処理するように指示する引数のないhtml(規則とビューを使用)。

これは次のように書くことができます(JSのような擬似コードを使用):



//基本クラスからレスポンダーへのインスタンスを取得しますvarformat = get_responder()//デフォルトの方法でレンダリングするhtmlを登録します//(ビューと規則により)format.register( 'html')//登録しますjsonも。 .jsonの引数は// method_missingの2番目の引数( 'json'が最初)であり、//応答を構成するオプションの方法が含まれています。この場合、jsonとしてシリアル化します。 format.register( 'json'、renderOptions)

この部分は私を混乱させました。私はまだそれが直感的ではないと思います。 Rubyはこの手法をかなり使用しているようです。クラス全体(レスポンダー)がメソッドの実装になります。活用するためにmethod_missing、クラスのインスタンスが必要なので、メソッドのようなオブジェクトを渡すコールバックを渡す必要があります。 20年間Cのような言語でコーディングしてきた人にとって、これは非常に逆行していて、私には直感的ではありません。それは悪いことではありません!でも、そういうバックグラウンドを持つ人が頭を悩ませる必要があるので、OPが求めていたのかもしれません。

p.s. RoR4.2では注意してくださいresponse_toはレスポンダーgemに抽出されました。


これは、Railsヘルパーメソッドを利用するRubyコードのブロックです。ブロックにまだ慣れていない場合は、Rubyで多くのブロックを見ることができます。



response_toは、Controllerクラス(またはそのスーパークラス)にアタッチされているRailsヘルパーメソッドです。これは、ビュー(ブラウザーに送信される)に送信される応答を参照しています。

この例のブロックは、ブラウザーがhtmlまたはjsonデータを要求するたびに、コントローラーからビューに送信されるデータのフォーマット(ブロック内の「format」パラメーターを渡すことによる)です。

ローカルマシンを使用していて、Postスキャフォールドを設定している場合は、次のURLにアクセスできます。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つにすぎません。

これを書くRails3の方法は次のようになります。

クラスPostsController 置くことによってクラスの先頭にあるrespond_to:html、:xml、:jsonを使用すると、コントローラーがビューに送信するすべての形式を宣言できます。

次に、コントローラーメソッドでは、respond_with(@whatever_object_you_have)を実行するだけです。

Railsが自動生成するものよりもコードを少し単純化するだけです。

この内部の仕組みについて知りたい場合 ..。

私が理解していることから、Railsはオブジェクトをイントロスペクトして、実際のフォーマットがどうなるかを判断します。 'format'変数の値は、このイントロスペクションに基づいています。 Railsは、少しの情報で多くのことを実行できます。単純な@postまたは:postがどこまで進むかに驚かれることでしょう。

たとえば、次のような_user.html.erb部分ファイルがある場合:

_user.html.erb

  • 次に、これだけでインデックスビューに表示され、Railsは、「users」の部分を見つけて、すべての「users」オブジェクトを反復処理する必要があることを認識します。

    index.html.erb

     

    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


    私の知る限り、respond_toはActionControllerにアタッチされたメソッドであり、すべてのコントローラーがActionControllerを継承しているため、すべてのコントローラーで使用できます。 Railsのrespond_toメソッドは次のとおりです。

    def response_to(&block)responder = Responder.new(self)block.call(responder)responder.respond end

    私がここに示すように、あなたはそれにブロックを渡します:

    に対応する<>行う|フォーマット| format.html format.xml {render:xml => @whatever} end<>  

    NS |フォーマット| 一部はブロックが予期している引数であるため、respond_toメソッド内でそれを使用できます。どのように?

    さて、respond_toメソッドで接頭辞&が付いたブロックを渡すことに気付いた場合は、そのブロックをProcとして扱うためにそれを行います。引数には「.xml」、「。html」があるので、それを呼び出すメソッドとして使用できます。

    基本的にrespond_toクラスで行うことは、Responderクラスのインスタンスに対してメソッド '.html、.xml、.json'を呼び出すことです。