3

私はルビーとレールが初めてです。誰かが以下の構造を指摘してください。メソッド (def) に Respond_to コンストラクトが表示されます。メソッド内のメソッドですか?つまり、ここで言語構造を理解しようとしています。

特定の形式で応答を送信するという機能を理解しています。

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @posts }
    end
4

3 に答える 3

3

言語構造は ruby​​ ブロックです。しかし、本当に理解したい場合respond_toは、概要を説明するブログ投稿をご覧ください。

Respond_to はどのように機能しますか?

理解しておくべき重要なことは、respond_to はコントローラーのスーパークラスである ActionController にアタッチされたメソッドであり、ブロックと呼ばれるものを引数として渡しているということです。

...

Respond_to メソッド内では、引数を 1 つ取る Proc になります。この引数には、呼び出される .xml および .html メソッドがあります。Respond_to 内から Proc を呼び出すときに、何を引数として Proc に渡しますか? Responder クラスのインスタンスを渡します。

したがって、responder クラスのインスタンスで .html と .xml を呼び出すことになり、respond_to メソッド内のブロック (Proc に変換されています) に渡されます… ふー。

于 2012-07-26T06:47:49.807 に答える
2

閉鎖です。これは、他の言語で機能するように関数を一時停止するようなものです。つまり、Rubyでは、コレクションを反復処理する2つのオプションがあります。

for elem in collection
  # do something
end

また

collection.each do |elem|
  # do something
end

この2つには違いがありますが、ここでは説明しません。ご覧のとおり、関数をメソッドに渡して内部で実行するようなものです。do |variables| ... endただし、ブロックを渡すには、ブロックまたはブロックを使用する2つの方法もあり{ |variables| ... }ます。ブロックを受け入れる独自のメソッドを作成する場合は、複数の方法があります(少し異なりますが、同じように実行されます)。

def run_3_times
  yield
  yield
  yield
end

また

def run_3_times(&block)
  block.call
  block.call
  block.call
end

どちらも同じように呼ばれます。

run_3_times { puts 'hello' }
# will yield
hello
hello
hello

ただし、ブロックが渡されない場合は別のエラーが発生します。

# when using yield
LocalJumpError: no block given (yield)

# when using Proc.call
NoMethodError: undefined method `call' for nil:NilClass
from (pry):8:in `run_3_times'

ここにそれについてのいくつかの記事があります:

于 2012-07-26T06:43:54.443 に答える