diff options
Diffstat (limited to 'actionpack/lib/action_view/helpers/capture_helper.rb')
-rw-r--r-- | actionpack/lib/action_view/helpers/capture_helper.rb | 118 |
1 files changed, 65 insertions, 53 deletions
diff --git a/actionpack/lib/action_view/helpers/capture_helper.rb b/actionpack/lib/action_view/helpers/capture_helper.rb index 91cff4f981..7cf2b02659 100644 --- a/actionpack/lib/action_view/helpers/capture_helper.rb +++ b/actionpack/lib/action_view/helpers/capture_helper.rb @@ -1,58 +1,36 @@ module ActionView module Helpers - # Capture lets you extract parts of code which - # can be used in other points of the template or even layout file. - # - # == Capturing a block into an instance variable - # - # <% @script = capture do %> - # [some html...] - # <% end %> - # - # == Add javascript to header using content_for - # - # content_for("name") is a wrapper for capture which will - # make the fragment available by name to a yielding layout or template. - # - # layout.erb: - # - # <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> - # <head> - # <title>layout with js</title> - # <script type="text/javascript"> - # <%= yield :script %> - # </script> - # </head> - # <body> - # <%= yield %> - # </body> - # </html> - # - # view.erb - # - # This page shows an alert box! - # - # <% content_for("script") do %> - # alert('hello world') - # <% end %> - # - # Normal view text + # CaptureHelper exposes methods to let you extract generated markup which + # can be used in other parts of a template or layout file. + # It provides a method to capture blocks into variables through capture and + # a way to capture a block of code for use in a layout through content_for. module CaptureHelper - # Capture allows you to extract a part of the template into an - # instance variable. You can use this instance variable anywhere - # in your templates and even in your layout. + # The capture method allows you to extract a part of the template into a + # variable. You can then use this value anywhere in your templates or layout. # - # Example of capture being used in a .erb page: + # ==== Examples + # The capture method can be used in RHTML (ERb) templates... # # <% @greeting = capture do %> - # Welcome To my shiny new web page! + # Welcome to my shiny new web page! The date and time is + # <%= Time.now %> # <% end %> # - # Example of capture being used in a .builder page: + # ...and Builder (RXML) templates. # - # @greeting = capture do - # 'Welcome To my shiny new web page!' + # @timestamp = capture do + # "The current timestamp is #{Time.now}." # end + # + # You can then use the content as a variable anywhere else. For + # example: + # + # <html> + # <head><title><%= @greeting %></title></head> + # <body> + # <b><%= @greeting %></b> + # </body></html> + # def capture(*args, &block) # execute the block begin @@ -68,19 +46,53 @@ module ActionView end end - # Calling content_for stores the block of markup for later use. - # Subsequently, you can make calls to it by name with <tt>yield</tt> - # in another template or in the layout. + # Calling content_for stores the block of markup in an identifier for later use. + # You can make subsequent calls to the stored content in another template or in the layout + # by calling it by name with <tt>yield</tt>. # - # Example: + # ==== Examples # - # <% content_for("header") do %> - # alert('hello world') + # <% content_for("authorized") do %> + # alert('You are not authorized for that!') + # <% end %> + # + # You can then use <tt>yield :authorized</tt> anywhere in your templates. + # + # <%= yield :authorized if current_user == nil %> + # + # You can also use these variables in a layout. For example: + # + # <!-- This is the layout --> + # <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> + # <head> + # <title>My Website</title> + # <%= yield :script %> + # </head> + # <body> + # <%= yield %> + # </body> + # </html> + # + # And now we'll create a view that has a content_for call that + # creates the <tt>script</tt> identifier. + # + # <!-- This is our view --> + # Please login! + # + # <% content_for("script") do %> + # <script type="text/javascript">alert('You are not authorized for this action!')</script> # <% end %> # - # You can use yield :header anywhere in your templates. + # Then in another view you may want to do something like this: + # + # <%= link_to_remote 'Logout', :action => 'logout' %> + # + # <% content_for("script") do %> + # <%= javascript_include_tag :defaults %> + # <% end %> # - # <%= yield :header %> + # That will include Prototype and Scriptaculous into the page; this technique + # is useful if you'll only be using these scripts on a few views. # # NOTE: Beware that content_for is ignored in caches. So you shouldn't use it # for elements that are going to be fragment cached. |