3

私はcontent_for がどのように機能するかを見ていblock.callて、capture_erb_with_bufferメソッドで を観察しました。それはどうやら魔法のようにバッファ変数に書き込み、その後プルーニングされます。ただし、これは非推奨であり、<%=yield :tag%>今すぐ呼び出すことができます。これはどのように作動しますか?ERB テンプレートから yield を呼び出した場合、どこに yield しますか?

ポイントを説明するための簡単なコードサンプルをいただければ幸いです。

4

3 に答える 3

4

ERB レベルでどのようyieldに機能するかはわかりませんが、レイアウトに適用したときにどのように機能するかは知っています。

サンプルの layout.html.erb ファイルを次に示します。

<html>
  <head>
    <title> <%= @title || 'Plain Title' %> </title>
    <%= yield :head %>
  </head>
<body>
  <div id='menu'>
    <%= yield :menu %>
  </div>
  <div id='content'>
    <%= yield %>
  </div>
  <div id='footer'>
    <%= yield :footer %>
  </div>
</body>

4 つの yield (:head、:menu、:footer、および default) とインスタンス変数 @title を定義しました。

これで、コントローラー アクションは、これらのスポットに挿入されるビューをレンダリングできるようになりました。ビューはレイアウトの前にレンダリングされるので、ビューで @title のような変数を定義し、それをレイアウトで定義できることに注意してください。

サンプル ビュー: About ページ

<% @title = 'About' %>
<% content_for :menu do %>
  <%= link_to 'Back to Home', :action => :home %>
<% end %>

We rock!

<% content_for :footer do %>
  An Illinois based company.
<% end %>

編集ページ

<% @title = 'Edit' %>
<% content_for :head do %>
  <style type='text/css'> .edit_form div {display:inline-block;} </style>
<% end %>

<% form_for :thing, :html => {:class => 'edit_form'} do |f| %>
   ...
<% end %>

データを入れたい歩留まりを組み合わせて一致させることができ、レイアウトファイルcontent_for :somethingのマッチングに挿入されます。yield :something

パーシャルでも機能します。パーシャルは独自の content_for :something ブロックを挿入でき、他の content_for 呼び出しで追加されます。

于 2010-04-13T21:05:56.013 に答える
2

execute呼び出されたこの小さな小さなメソッドActionView::Baseがすべてを説明しています。 http://google.com/codesearch/p?hl=en#m8Vht-lU3vE/vendor/rails/actionpack/lib/action_view/base.rb&q=capture_helper.rb&d=5&l=337

  def execute(template)
    send(template.method, template.locals) do |*names|
      instance_variable_get "@content_for_#{names.first || 'layout'}"
    end
  end

ブロックはdo |*names|... endを受け取るブロックですyield@content_for_#{names.first}プロセスで設定されている変数と一致することがわかりますcontent_for

これは #render の AV::TemplateHandlers::Compilable から呼び出されます。他の場所も同様だと思います。

  def render(template)
    @view.send :execute, template
  end

http://google.com/codesearch/p?hl=en#m8Vht-lU3vE/vendor/rails/actionpack/lib/action_view/template_handlers/compilable.rb&q=execute&exact_package=git://github.com/payalgupta/todo- list.git&sa=N&cd=17&ct=rc&l=28

于 2010-04-26T07:44:02.670 に答える
-1

単に:

メソッドでyieldを呼び出すと、ブロックを介してメソッドに渡されたコードが実行されます。

例えば

def my_method
  yield
end

my_method { puts "Hello" }
my_method { puts "World" }

これらの5行は、画面に次の出力を生成します

Hello
World

Rubyでのyieldの詳細については、次のページを参照してください。Ruby Yield

于 2010-04-13T22:44:51.233 に答える