[解決済み】Rails: respond_toブロックはどのように動作しますか?
質問
を通過しています。 Rails入門 のガイドで、6.7節で混乱しました。scaffoldを生成した後、私のコントローラに以下の自動生成されたブロックが見つかりました。
def index
@posts = Post.all
respond_to do |format|
format.html # index.html.erb
format.json { render :json => @posts }
end
end
respond_toブロックが実際にどのように動作するのか理解したい。formatはどのようなタイプの変数ですか?.htmlや.jsonはformatオブジェクトのメソッドなのでしょうか?また、その ドキュメント に対して
ActionController::MimeResponds::ClassMethods::respond_to
は質問に答えていない。
どのように解決するのですか?
私はRubyの初心者ですが、この同じコードで行き詰まりました。私がつまずいた部分は、ここで見つけたいくつかの答えよりももう少し基本的なものでした。これは誰かの役に立つかもしれないし、そうでないかもしれません。
-
respond_to
はスーパークラスのメソッドActionController
. -
はブロックを受け取ります。これはデリゲートのようなものです。このブロックは
do
までend
である。|format|
をブロックの引数として指定します。 -
respond_to はブロックを実行し、レスポンダを
format
引数で指定します。
http://api.rubyonrails.org/v4.1/classes/ActionController/Responder.html
-
は
Responder
に対するメソッドは含まれていません。.html
または.json
しかし、私たちはこれらのメソッドをとにかく呼び出すのです この部分は私を混乱させました。 -
Rubyには
method_missing
. 存在しないメソッドを呼び出した場合 (たとえばjson
またはhtml
)、Ruby はmethod_missing
メソッドに置き換えます。
http://ruby-metaprogramming.rubylearning.com/html/ruby_metaprogramming_2.html
-
は
Responder
クラスはそのmethod_missing
を一種の登録として使用します。json'を呼び出すと、拡張子が.jsonのリクエストに対して、jsonにシリアライズして応答するよう指示していることになります。そのためにはhtml
を引数なしで指定すると、デフォルトの方法 (規約とビューを使用) で .html リクエストを処理するようになります。
このように書くこともできます(JS的な擬似コードを使って)。
// get an instance to a responder from the base class
var format = get_responder()
// register html to render in the default way
// (by way of the views and conventions)
format.register('html')
// register json as well. the argument to .json is the second
// argument to method_missing ('json' is the first), which contains
// optional ways to configure the response. In this case, serialize as json.
format.register('json', renderOptions)
この部分は、私を混乱させました。今でも直感的でないと思っています。Rubyはこのテクニックをかなり使っているようです。クラス全体(
responder
) がメソッドの実装になります。を活用するために
method_missing
そのため、メソッドに似たオブジェクトを渡すコールバックを渡さなければならない。20数年間C言語ライクな言語でコーディングしてきた人間にとって、これは非常に後ろ向きで直感的ではありません。それが悪いというわけではありません。しかし、そのような背景を持つ多くの人が頭を悩ませることであり、OPが求めていたことかもしれません。
p.s. RoR 4.2での注意点
respond_to
に抽出されました。
レスポンダー
gemを使用しています。
関連
-
[解決済み】なぜRuby on Railsは、http://localhost:3000 の代わりに http://0.0.0.0:3000 を使用するのですか?
-
[解決済み】Bundler: コマンドが見つからない
-
[解決済み] Ruby/Rails の「フック」とは何ですか?
-
[解決済み] Rubyで変数をインクリメントする [重複]。
-
[解決済み] Ruby on Railsのためにnetbeansを構成する方法は?
-
[解決済み] Oauth2 Instagram API "リダイレクトURIが登録されたリダイレクトURIと一致しない"
-
[解決済み] 属性を割り当てる場合、引数としてハッシュを渡す必要がある
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み】Railsの認証トークンを理解する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】警告:定数 ::Fixnum は非推奨 新しいモデルを生成するとき
-
[解決済み] nil:NilClass の未定義メソッド `each'... なぜでしょうか?
-
[解決済み] 変更欄のRailsマイグレーション
-
[解決済み] Rubyで変数をインクリメントする [重複]。
-
[解決済み] erbでコメントを追加する最適な方法
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] 検索 vs 発見する by vs どこに
-
[解決済み] Devise Admin Roleの追加【終了しました
-
[解決済み] Railsはsaveでモデル内の検証をスキップしますか?
-
[解決済み] bundle install --without production は何をするのですか?