SlideShare a Scribd company logo
1 of 59
Download to read offline
WELCOME!

Monday, November 2, 2009
WHO AM I?

Monday, November 2, 2009
ME:
              JUSTIN HALSALL


Monday, November 2, 2009
FRONT END DEV
                             http://www.flickr.com/photos/nathaninsandiego/3687500937/




Monday, November 2, 2009
FRONT END RAILS DEV
                           http://www.flickr.com/photos/nathaninsandiego/3687500937/




Monday, November 2, 2009
DSLS FOR FRONT
                END RAILS


Monday, November 2, 2009
DSLS FOR FRONT END RAILS
                           ~OR~


              HOW TO USE BLOCKS
              IN YOUR VIEWS FOR
              MAXIMUM AMOUNTS
               OF AWESOMENESS

Monday, November 2, 2009
~BACKSTORY~


Monday, November 2, 2009
a developer
                      working in
                      his views




                               A DEVELOPER
                                    http://www.flickr.com/photos/nathonline/918128338




Monday, November 2, 2009
a developer
                      working in
                      his views




                               A DEVELOPER
                                    http://www.flickr.com/photos/nathonline/918128338
                                    http://www.flickr.com/photos/pipeapple/2190051229




Monday, November 2, 2009
create sexy vertical
                             tabs
                             displayed with
                             javascript




                           VERTICAL TABS
                             http://www.flickr.com/photos/denn/5291024/




Monday, November 2, 2009
Monday, November 2, 2009
All pages have a
                           couple things in
                           common




Monday, November 2, 2009
<h1>



                           All pages have a
                           couple things in
                           common




Monday, November 2, 2009
<h1>
                <ul>

                           All pages have a
                           couple things in
                           common




Monday, November 2, 2009
<h1>
                <ul>

                            All pages have a
                            couple things in
                            common




                           <div>



Monday, November 2, 2009
<div class='clearfix lead'>
         <h1>...</h1>
         <p>...</p>
       </div>
       <div id='add_connection' class='add_connection'>
         <div id='tabs' class='rounded_container'>
           <ul>
              <li><a href='#tabs-step1'>1. ...</a></li>
              <li><a href='#tabs-step2'>2. ...</a></li>
              <li><a href='#tabs-step3'>3. ...</a></li>
              <li><a href='#tabs-sync'>4. ...</a></li>
              <li><a href='#tabs-done'>Finished</a></li>
           </ul>
           <div id='tabs-step1' class='setup_box'>
              <h2>1. ...</h2>
              ...
              <a href='#tabs-step2' class='next'>next</a>
           </div>
           <div id='tabs-step2' class='setup_box'>
              <h2>2. ...</h2>
              ...
              <a href='#tabs-step1' class='previous'>previous</a>
              <a href='#tabs-step3' class='next'>next</a>
           </div>
           <div id='tabs-step3' class='setup_box'>
              <h2>3. ...</h2>
              ...
              <a href='#tabs-step2' class='previous'>previous</a>
              <a href='#tabs-sync' class='next'>next</a>
           </div>
           <div id='tabs-sync' class='setup_box'>
              <h2>4. ...</h2>
              <h3>Status</h3>
              <p id='status_message'>Checking sync status...</p>
              <a href='#tabs-step3' class='previous'>previous</a>
              <a href='#tabs-done' class='next'>next</a>
           </div>
           <div id='tabs-done' class='setup_box'>
              <h2>Finished - Well done!</h2>
              <img src='/images/giant_success_tick.png' class='success' alt='Success!'>
              <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a>
              <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a>
              <a href='#tabs-sync' class='previous'>previous</a>
           </div>
         </div>
       </div>




Monday, November 2, 2009
<div class='clearfix lead'>
         <h1>...</h1>


                                                 o ts
                                                L f
         <p>...</p>
       </div>
       <div id='add_connection' class='add_connection'>




                                                    o L
         <div id='tabs' class='rounded_container'>
           <ul>
              <li><a href='#tabs-step1'>1. ...</a></li>




                                                        M
              <li><a href='#tabs-step2'>2. ...</a></li>
              <li><a href='#tabs-step3'>3. ...</a></li>




                                                      T
              <li><a href='#tabs-sync'>4. ...</a></li>
              <li><a href='#tabs-done'>Finished</a></li>
           </ul>




                                                   H
           <div id='tabs-step1' class='setup_box'>
              <h2>1. ...</h2>
              ...
              <a href='#tabs-step2' class='next'>next</a>
           </div>
           <div id='tabs-step2' class='setup_box'>
              <h2>2. ...</h2>
              ...
              <a href='#tabs-step1' class='previous'>previous</a>
              <a href='#tabs-step3' class='next'>next</a>
           </div>
           <div id='tabs-step3' class='setup_box'>
              <h2>3. ...</h2>
              ...
              <a href='#tabs-step2' class='previous'>previous</a>
              <a href='#tabs-sync' class='next'>next</a>
           </div>
           <div id='tabs-sync' class='setup_box'>
              <h2>4. ...</h2>
              <h3>Status</h3>
              <p id='status_message'>Checking sync status...</p>
              <a href='#tabs-step3' class='previous'>previous</a>
              <a href='#tabs-done' class='next'>next</a>
           </div>
           <div id='tabs-done' class='setup_box'>
              <h2>Finished - Well done!</h2>
              <img src='/images/giant_success_tick.png' class='success' alt='Success!'>
              <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a>
              <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a>
              <a href='#tabs-sync' class='previous'>previous</a>
           </div>
         </div>
       </div>




Monday, November 2, 2009
<div class='clearfix lead'>
         <h1>...</h1>


                                                 o ts
                                                L f
         <p>...</p>
       </div>
       <div id='add_connection' class='add_connection'>




                                                    o L
         <div id='tabs' class='rounded_container'>
           <ul>
              <li><a href='#tabs-step1'>1. ...</a></li>




                                                        M
              <li><a href='#tabs-step2'>2. ...</a></li>
              <li><a href='#tabs-step3'>3. ...</a></li>




                                                      T
              <li><a href='#tabs-sync'>4. ...</a></li>
              <li><a href='#tabs-done'>Finished</a></li>
           </ul>




                                                   H
           <div id='tabs-step1' class='setup_box'>
              <h2>1. ...</h2>
              ...
              <a href='#tabs-step2' class='next'>next</a>
           </div>
           <div id='tabs-step2' class='setup_box'>
              <h2>2. ...</h2>
              ...
              <a href='#tabs-step1' class='previous'>previous</a>
              <a href='#tabs-step3' class='next'>next</a>
           </div>
           <div id='tabs-step3' class='setup_box'>




                                         Du
              <h2>3. ...</h2>
              ...
              <a href='#tabs-step2' class='previous'>previous</a>




                                                    pli
              <a href='#tabs-sync' class='next'>next</a>
           </div>
           <div id='tabs-sync' class='setup_box'>
              <h2>4. ...</h2>




                                                              ca
              <h3>Status</h3>
              <p id='status_message'>Checking sync status...</p>




                                                                tio
              <a href='#tabs-step3' class='previous'>previous</a>
              <a href='#tabs-done' class='next'>next</a>
           </div>




                                                                    n
           <div id='tabs-done' class='setup_box'>
              <h2>Finished - Well done!</h2>
              <img src='/images/giant_success_tick.png' class='success' alt='Success!'>
              <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a>
              <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a>
              <a href='#tabs-sync' class='previous'>previous</a>
           </div>
         </div>
       </div>




Monday, November 2, 2009
<div class='clearfix lead'>
         <h1>...</h1>


                                                 o ts
                                                L f
         <p>...</p>
       </div>
       <div id='add_connection' class='add_connection'>




                                                    o L
         <div id='tabs' class='rounded_container'>
           <ul>
              <li><a href='#tabs-step1'>1. ...</a></li>




                                                        M
              <li><a href='#tabs-step2'>2. ...</a></li>
              <li><a href='#tabs-step3'>3. ...</a></li>




                                                      T
              <li><a href='#tabs-sync'>4. ...</a></li>
              <li><a href='#tabs-done'>Finished</a></li>
           </ul>




                                                   H
           <div id='tabs-step1' class='setup_box'>
              <h2>1. ...</h2>
              ...
              <a href='#tabs-step2' class='next'>next</a>
           </div>
           <div id='tabs-step2' class='setup_box'>
              <h2>2. ...</h2>
              ...
              <a href='#tabs-step1' class='previous'>previous</a>
              <a href='#tabs-step3' class='next'>next</a>
           </div>
           <div id='tabs-step3' class='setup_box'>




                                         Du
              <h2>3. ...</h2>
              ...
              <a href='#tabs-step2' class='previous'>previous</a>




                                                    pli
              <a href='#tabs-sync' class='next'>next</a>
           </div>
           <div id='tabs-sync' class='setup_box'>
              <h2>4. ...</h2>




                                                              ca
              <h3>Status</h3>
              <p id='status_message'>Checking sync status...</p>




                                                                tio
              <a href='#tabs-step3' class='previous'>previous</a>
              <a href='#tabs-done' class='next'>next</a>
           </div>




                                                                    n
           <div id='tabs-done' class='setup_box'>
              <h2>Finished - Well done!</h2>
              <img src='/images/giant_success_tick.png' class='success' alt='Success!'>
              <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a>
              <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a>
              <a href='#tabs-sync' class='previous'>previous</a>
           </div>
         </div>
       </div>




Monday, November 2, 2009
Imagine having to
           do this 8 times and
           changing things
           around

           Awefull




Monday, November 2, 2009
HOW COULD
             THIS BE BETTER?


Monday, November 2, 2009
And on the 8th day I created methods
                                to awesomify with your views.
                              You shall refer to these as helpers.


                                      if we where evil we
                                      could misuse rails
                                      helpers with blocks
                                      to create a nice little
                                      DSL we can use
                                      everywhere




             GOD GAVE US HELPERS
                           http://www.flickr.com/photos/zippy/2429678961/




Monday, November 2, 2009
And on the 8th day I created methods
                                to awesomify with your views.
                              You shall refer to these as helpers.


                                      if we where evil we
                                      could misuse rails
                                      helpers with blocks
                                      to create a nice little
                                      DSL we can use
                                      everywhere




             GOD GAVE US HELPERS
                           http://www.flickr.com/photos/zippy/2429678961/




Monday, November 2, 2009
And on the 8th day I created methods
                                to awesomify with your views.
                                           Kill JAVA!
                              You shall refer to these as helpers.


                                      if we where evil we
                                      could misuse rails
                                      helpers with blocks
                                      to create a nice little
                                      DSL we can use
                                      everywhere




             GOD GAVE US HELPERS
                           http://www.flickr.com/photos/zippy/2429678961/




Monday, November 2, 2009
<% add_connection_tabs(:for => "...", :subtitle => "...") do |tab| %>

             <% tab.step "..." do %>
               ...
             <% end %>

             <% tab.step "..." do %>
               ...
             <% end %>

             <% tab.step "..." do %>
               ...
             <% end %>

             <% tab.sync %>

             <% tab.done %>

         <% end %>




Monday, November 2, 2009
http://www.flickr.com/photos/bodoggirl/3598561539   http://www.flickr.com/photos/juice10/3501376901



Monday, November 2, 2009
x y!
               Se
       http://www.flickr.com/photos/bodoggirl/3598561539   http://www.flickr.com/photos/juice10/3501376901



Monday, November 2, 2009
LOOKING GOOD HURTS
                           http://www.flickr.com/photos/thenovys/3791884189




Monday, November 2, 2009
HOW TO TAKE THE
                      HURT OUT OF
                   LOOKING BEAUTIFUL
                                                        (ehow.com)
               1) Freeze t weezers before t weezing eyebrows, it'll numb the area being t weezed at its touch.
               2) Carry those oversized designer purses and totes on different shoulders everyday to avoid
               straining your arms and shoulder muscles.
               3) Make sure to thoroughly stretch your muscles before exercising to increase.. bla bla bla
               4) Choose the best fitted high heel or stiletto possible to reduce pain and pressure on your toes
               (translated – don’t choose a heel that’ll make your foot slide leaving a gap bet ween the shoe
               and back of your foot).
               5) Something about sticking tape on your toes so that your sandals don't eat your feet


Monday, November 2, 2009
BLOCK_HELPER
                           http://github.com/markevans/block_helpers

               Dax briefly talked about
               it yesterday




Monday, November 2, 2009
wor
                                                  ks b
                                              stick etter
                                                   y tap than
                                                        e on    stick
                                                             your ing
                                                                  toes
                BLOCK_HELPER
                           http://github.com/markevans/block_helpers

               Dax briefly talked about
               it yesterday




Monday, November 2, 2009
THE MEAT
                           http://www.flickr.com/photos/splorp/12200621




Monday, November 2, 2009
# config/environment.rb
             config.gem "block_helpers",
                        :lib => "block_helpers",
                        :source => "http://gemcutter.org"



             $ rake gems:install




Monday, November 2, 2009
THE PAGE WE ARE GOING TO
                           DRYUP
                   <h1>Symptoms of Apple addiction</h1>
                   <div id='symptoms'>
                     <ul class="tabs">
                       <li><a href="#praying_panel">Praying</a></li>
                       <li><a href="#happiness_panel">Happiness</a></li>
                       <li><a href="#microsoft_panel">Microsoft</a></li>
                     </ul>

                     <div class="panes">
                       <div id="praying_panel">
                          <h2>Praying to Steve Jobs</h2>
                          <p>It is not uncommon for an Apple addict to pray to his Steveness.</p>
                       </div>
                       <div id="happiness_panel">
                          <h2>Happiness and iPhone battery level equal</h2>
                          <p>Addict gets the shakes from low battery power</p>
                       </div>
                       <div id="microsoft_panel">
                          <h2>Microsoft powered nervous break downs</h2>
                          <p>Addict gets the shakes from non-Apple devices</p>
                       </div>
                     </div>
                   </div>



Monday, November 2, 2009
THE PAGE WE ARE GOING TO
                           DRYUP
                   <h1>Symptoms of Apple addiction</h1>
                   <div id='symptoms'>
                     <ul class="tabs">
                       <li><a href="#praying_panel">Praying</a></li>
                       <li><a href="#happiness_panel">Happiness</a></li>
                       <li><a href="#microsoft_panel">Microsoft</a></li>
                     </ul>

                     <div class="panes">
                       <div id="praying_panel">
                          <h2>Praying to Steve Jobs</h2>
                          <p>It is not uncommon for an Apple addict to pray to his Steveness.</p>
                       </div>
                       <div id="happiness_panel">
                          <h2>Happiness and iPhone battery level equal</h2>
                          <p>Addict gets the shakes from low battery power</p>
                       </div>
                       <div id="microsoft_panel">
                          <h2>Microsoft powered nervous break downs</h2>
                          <p>Addict gets the shakes from non-Apple devices</p>
                       </div>
                     </div>
                   </div>



Monday, November 2, 2009
NO MORE TOWELS NEEDED

       <% symptom_tabs_for "Apple addiction" do |tabs| %>

           <% tabs.symptom "Praying to Steve Jobs" do %>
             <p>It is not uncommon for an Apple addict to pray to his Steveness.</p>
           <% end %>

           <% tabs.symptom "Happiness and iPhone energy level equal" do %>
             <p>Addict gets the shakes from low battery power</p>
           <% end %>

           <% tabs.symptom "Microsoft powered nervous break downs" do %>
             <p>Addict gets the shakes from non-Apple devices</p>
           <% end %>

       <% end %>




Monday, November 2, 2009
ARE WE THERE YET?
                           http://www.flickr.com/photos/sbluerock/415736417




Monday, November 2, 2009
NO! SHUT UP OR NO MORE TV!
                           http://www.flickr.com/photos/chubbychandru/2273272995




Monday, November 2, 2009
FIRST THINGS FIRST

       # view.html.erb
       <% symptom_tabs_for "Apple addiction" do |tabs| %>
         ...
       <% end %>

       # application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           # symptom_tabs_for code
         end
       end


Monday, November 2, 2009
# view.html.erb
       <% symptom_tabs_for "Apple addiction" do |tabs| %>
         <% tabs.symptom "Praying to Steve Jobs" do %>
           ...
         <% end %>
         ...
       <% end %>

       # application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
           end

           def symptom(name, &block)
           end
         end
       end

Monday, November 2, 2009
# view.html.erb
       <% symptom_tabs_for "Apple addiction" do |tabs| %>
         ...
       <% end %>

       # application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

                def display(body)
                  content_tag('h1', "Symptoms of #{@title}") +
                  content_tag('div', (
                    content_tag('div', body, :class => 'panes')),
                    :id => 'symptoms')
                end

         end
       end


Monday, November 2, 2009
# view.html.erb
       <% symptom_tabs_for "Apple addiction" do |tabs| %>
         ...
       <% end %>

       # application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

                def display(body)
                  content_tag('h1', "Symptoms of #{@title}") +
                  content_tag('div', (
                    content_tag('div', body, :class => 'panes')),
                    :id => 'symptoms')
                end

         end
       end


Monday, November 2, 2009
# view.html.erb
       <% symptom_tabs_for "Apple addiction" do |tabs| %>
         ...
       <% end %>

       # application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

                def display(body)
                  content_tag('h1', "Symptoms of #{@title}") +
                  content_tag('div', (
                    content_tag('div', body, :class => 'panes')),
                    :id => 'symptoms')
                end

         end
       end


Monday, November 2, 2009
# view.html.erb
       <% symptom_tabs_for "Apple addiction" do |tabs| %>
         ...
       <% end %>

       # application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

                def display(body)
                  content_tag('h1', "Symptoms of #{@title}") +
                  content_tag('div', (
                    content_tag('div', body, :class => 'panes')),
                    :id => 'symptoms')
                end

         end
       end


Monday, November 2, 2009
# view.html.erb
       <% symptom_tabs_for "Apple addiction" do |tabs| %>
         ...
       <% end %>

       # application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

             def display(body)
               content_tag('h1', "Symptoms of #{@title}") +
               content_tag('div', (
                 content_tag('div', body, :class => 'panes')),
                 :id => 'symptoms')
             end

         end
       end


       # browser
       <h1>Symptoms of Apple addiction</h1>
       <div id="symptoms">
         <div class="panes">

         </div>
       </div>


Monday, November 2, 2009
# application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

               def display(body)
                 content_tag('h1', "Symptoms of #{@title}") +
                 content_tag('div', (
                   content_tag('div', body, :class => 'panes')),
                   :id => 'symptoms')
               end

           def sypmtom(name, &block)
             @short = name.split.first
             @content = capture &block
             concat content_tag('div', (
               content_tag( 'h2', name) + @content),
               :id => "#{@short.downcase}_panel")
           end
         end
       end


Monday, November 2, 2009
# application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

               def display(body)
                 content_tag('h1', "Symptoms of #{@title}") +
                 content_tag('div', (
                   content_tag('div', body, :class => 'panes')),
                   :id => 'symptoms')
               end

           def sypmtom(name, &block)
             @short = name.split.first
             @content = capture(&block)
             concat content_tag('div', (
               content_tag( 'h2', name) + @content),
               :id => "#{@short.downcase}_panel")
           end
         end
       end


Monday, November 2, 2009
# application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

               def display(body)
                 content_tag('h1', "Symptoms of #{@title}") +
                 content_tag('div', (
                   content_tag('div', body, :class => 'panes')),
                   :id => 'symptoms')
               end

           def sypmtom(name, &block)
             @short = name.split.first
             @content = capture(&block)
             concat content_tag('div', (
               content_tag( 'h2', name) + @content),
               :id => "#{@short.downcase}_panel")
           end
         end
       end


Monday, November 2, 2009
# application_helper.rb
       module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base
           def initialize(title)
             @title = title
           end

               def display(body)
                 content_tag('h1', "Symptoms of #{@title}") +
                 content_tag('div', (
                   content_tag('div', body, :class => 'panes')),
                   :id => 'symptoms')
               end

           def sypmtom(name, &block)
             @short = name.split.first
             @content = capture(&block)
             concat content_tag('div', (
               content_tag( 'h2', name) + @content),
               :id => "#{@short.downcase}_panel")
           end
         end
       end


Monday, November 2, 2009
CONCAT


       concat "hello"
       # the equivalent of <%= "hello" %>




Monday, November 2, 2009
CAPTURE
       <% @greeting = capture do %>
         Welcome to my shiny new web page!    The date and time is
         <%= Time.now %>
       <% end %>



       def myblockheader(&block)
         content = capture(&block)
         concat(content_tag('h1', content))
       end

       <% myblockheader do %>
         Welcome to my shiny new web page!
       <% end %>


Monday, November 2, 2009
module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base

              def initialize(title)
                @title = title
                @tabs = []
              end

              def display(body)
                content_tag('h1', "Symptoms of #{@title}") +
                content_tag('div', (
                  content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') +
                  content_tag('div', body, :class => 'panes')),
                  :id => 'symptoms')
              end

              def symptom(name, &block)
                @short = name.split.first
                @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel")
                @content = capture &block
                concat content_tag('div', (
                  content_tag( 'h2', name) + @content),
                  :id => "#{@short.downcase}_panel")
              end

         end
       end



Monday, November 2, 2009
module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base

              def initialize(title)
                @title = title
                @tabs = []
              end

              def display(body)
                content_tag('h1', "Symptoms of #{@title}") +
                content_tag('div', (
                  content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') +
                  content_tag('div', body, :class => 'panes')),
                  :id => 'symptoms')
              end

              def symptom(name, &block)
                @short = name.split.first
                @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel")
                @content = capture &block
                concat content_tag('div', (
                  content_tag( 'h2', name) + @content),
                  :id => "#{@short.downcase}_panel")
              end

         end
       end



Monday, November 2, 2009
module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base

              def initialize(title)
                @title = title
                @tabs = []
              end

              def display(body)
                content_tag('h1', "Symptoms of #{@title}") +
                content_tag('div', (
                  content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') +
                  content_tag('div', body, :class => 'panes')),
                  :id => 'symptoms')
              end

              def symptom(name, &block)
                @short = name.split.first
                @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel")
                @content = capture &block
                concat content_tag('div', (
                  content_tag( 'h2', name) + @content),
                  :id => "#{@short.downcase}_panel")
              end

         end
       end



Monday, November 2, 2009
module ApplicationHelper
         class SymptomTabsFor < BlockHelpers::Base

              def initialize(title)
                @title = title
                @tabs = []
              end

              def display(body)
                content_tag('h1', "Symptoms of #{@title}") +
                content_tag('div', (
                  content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') +
                  content_tag('div', body, :class => 'panes')),
                  :id => 'symptoms')
              end

              def symptom(name, &block)
                @short = name.split.first
                @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel")
                @content = capture &block
                concat content_tag('div', (
                  content_tag( 'h2', name) + @content),
                  :id => "#{@short.downcase}_panel")
              end

         end
       end



Monday, November 2, 2009
COMMUNITY PLUG

                     dev-groups.org
                     rubyists.eu
                     http://amsterdam-rb.org/
                     http://groups.google.com/group/utrecht-rb




Monday, November 2, 2009
FIN...




Monday, November 2, 2009
JUSTIN HALSALL

                     blog: juice10.com
                     pet project: tvnotify.com
                     twitter.com/juice10
                     wakoopa.com/juice10
                     github.com/Juice10



Monday, November 2, 2009

More Related Content

Viewers also liked

Viewers also liked (10)

Railways
RailwaysRailways
Railways
 
Blue Ocean Strategy Henry Robben
Blue Ocean Strategy   Henry RobbenBlue Ocean Strategy   Henry Robben
Blue Ocean Strategy Henry Robben
 
R. zdrajkowski richard krok w kierunku klastra e_zdrowia w wl
R. zdrajkowski richard krok w kierunku klastra e_zdrowia w wlR. zdrajkowski richard krok w kierunku klastra e_zdrowia w wl
R. zdrajkowski richard krok w kierunku klastra e_zdrowia w wl
 
[Cia do chopp] Planejamento Digital
[Cia do chopp] Planejamento Digital[Cia do chopp] Planejamento Digital
[Cia do chopp] Planejamento Digital
 
Renovar - Tablóide
Renovar - TablóideRenovar - Tablóide
Renovar - Tablóide
 
Lunch Break
Lunch BreakLunch Break
Lunch Break
 
Possum Class Notes
Possum Class NotesPossum Class Notes
Possum Class Notes
 
propuesta didáctica de tecnología
propuesta didáctica de tecnologíapropuesta didáctica de tecnología
propuesta didáctica de tecnología
 
Cebic08 Sistema 4 Hilosñ
Cebic08 Sistema 4 HilosñCebic08 Sistema 4 Hilosñ
Cebic08 Sistema 4 Hilosñ
 
Silaboinformatica 150202110744-conversion-gate02
Silaboinformatica 150202110744-conversion-gate02Silaboinformatica 150202110744-conversion-gate02
Silaboinformatica 150202110744-conversion-gate02
 

Similar to DSLs for Front End Rails

Practical progressive enhancement
Practical progressive enhancementPractical progressive enhancement
Practical progressive enhancementGraham Bird
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單偉格 高
 
Vue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentówVue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentówLaravel Poland MeetUp
 
Copy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plazaCopy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plazahelgawerth
 
Game Changing Dependency Management
Game Changing Dependency ManagementGame Changing Dependency Management
Game Changing Dependency ManagementJeremy Kendall
 
Featured posts
Featured postsFeatured posts
Featured postsaidee58
 
Index of jquery template 2 Minuteman Summer Web Dev.
Index of jquery template 2 Minuteman Summer Web Dev.Index of jquery template 2 Minuteman Summer Web Dev.
Index of jquery template 2 Minuteman Summer Web Dev.Daniel Downs
 
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...Jeremy Fuksa
 
Try Web Components
Try Web ComponentsTry Web Components
Try Web Components拓樹 谷
 
Your Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckYour Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckAnthony Montalbano
 
Polymer Polytechnic George Town 2014
Polymer Polytechnic George Town 2014Polymer Polytechnic George Town 2014
Polymer Polytechnic George Town 2014Vin Lim
 
Herramientas de desarrollo e implementacion
Herramientas de desarrollo e implementacionHerramientas de desarrollo e implementacion
Herramientas de desarrollo e implementacionCarlos Solis
 
Bootstrap 3 in Joomla!
Bootstrap 3 in Joomla!Bootstrap 3 in Joomla!
Bootstrap 3 in Joomla!Hans Kuijpers
 

Similar to DSLs for Front End Rails (20)

El Codigo x jorge
El Codigo x jorgeEl Codigo x jorge
El Codigo x jorge
 
JQuery Mobile UI
JQuery Mobile UIJQuery Mobile UI
JQuery Mobile UI
 
Practical progressive enhancement
Practical progressive enhancementPractical progressive enhancement
Practical progressive enhancement
 
TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單TOSSUG HTML5 讀書會 新標籤與表單
TOSSUG HTML5 讀書會 新標籤與表單
 
Vue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentówVue.js - zastosowanie i budowa komponentów
Vue.js - zastosowanie i budowa komponentów
 
Copy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plazaCopy of-a-walk-around-westfall-plaza
Copy of-a-walk-around-westfall-plaza
 
Game Changing Dependency Management
Game Changing Dependency ManagementGame Changing Dependency Management
Game Changing Dependency Management
 
Featured posts
Featured postsFeatured posts
Featured posts
 
Upload[1]
Upload[1]Upload[1]
Upload[1]
 
Index of jquery template 2 Minuteman Summer Web Dev.
Index of jquery template 2 Minuteman Summer Web Dev.Index of jquery template 2 Minuteman Summer Web Dev.
Index of jquery template 2 Minuteman Summer Web Dev.
 
HTML5 Essentials
HTML5 EssentialsHTML5 Essentials
HTML5 Essentials
 
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...The Responsive Grid & You:  Extending Your WordPress Site Across Multiple Dev...
The Responsive Grid & You: Extending Your WordPress Site Across Multiple Dev...
 
Try Web Components
Try Web ComponentsTry Web Components
Try Web Components
 
Your Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages SuckYour Custom WordPress Admin Pages Suck
Your Custom WordPress Admin Pages Suck
 
Polymer Polytechnic George Town 2014
Polymer Polytechnic George Town 2014Polymer Polytechnic George Town 2014
Polymer Polytechnic George Town 2014
 
Herramientas de desarrollo e implementacion
Herramientas de desarrollo e implementacionHerramientas de desarrollo e implementacion
Herramientas de desarrollo e implementacion
 
laboratorio
laboratoriolaboratorio
laboratorio
 
Bootstrap 3 in Joomla!
Bootstrap 3 in Joomla!Bootstrap 3 in Joomla!
Bootstrap 3 in Joomla!
 
Navigation Bar.pptx
Navigation Bar.pptxNavigation Bar.pptx
Navigation Bar.pptx
 
iWebkit
iWebkitiWebkit
iWebkit
 

More from Justin Halsall

Principles, Backbone and Bottlenose
Principles, Backbone and BottlenosePrinciples, Backbone and Bottlenose
Principles, Backbone and BottlenoseJustin Halsall
 
Vote Amsterdam For EuRuKo 2012
Vote Amsterdam For EuRuKo 2012Vote Amsterdam For EuRuKo 2012
Vote Amsterdam For EuRuKo 2012Justin Halsall
 
Headless browser testing with ruby
Headless browser testing with rubyHeadless browser testing with ruby
Headless browser testing with rubyJustin Halsall
 

More from Justin Halsall (6)

Principles, Backbone and Bottlenose
Principles, Backbone and BottlenosePrinciples, Backbone and Bottlenose
Principles, Backbone and Bottlenose
 
Vote Amsterdam For EuRuKo 2012
Vote Amsterdam For EuRuKo 2012Vote Amsterdam For EuRuKo 2012
Vote Amsterdam For EuRuKo 2012
 
Headless browser testing with ruby
Headless browser testing with rubyHeadless browser testing with ruby
Headless browser testing with ruby
 
HTML5 semantics
HTML5 semanticsHTML5 semantics
HTML5 semantics
 
HTML5 offline
HTML5 offlineHTML5 offline
HTML5 offline
 
Front End on Rails
Front End on RailsFront End on Rails
Front End on Rails
 

Recently uploaded

SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAndikSusilo4
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhisoniya singh
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 

Recently uploaded (20)

SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Azure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & ApplicationAzure Monitor & Application Insight to monitor Infrastructure & Application
Azure Monitor & Application Insight to monitor Infrastructure & Application
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | DelhiFULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY 🔝 8264348440 🔝 Call Girls in Diplomatic Enclave | Delhi
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 

DSLs for Front End Rails

  • 2. WHO AM I? Monday, November 2, 2009
  • 3. ME: JUSTIN HALSALL Monday, November 2, 2009
  • 4. FRONT END DEV http://www.flickr.com/photos/nathaninsandiego/3687500937/ Monday, November 2, 2009
  • 5. FRONT END RAILS DEV http://www.flickr.com/photos/nathaninsandiego/3687500937/ Monday, November 2, 2009
  • 6. DSLS FOR FRONT END RAILS Monday, November 2, 2009
  • 7. DSLS FOR FRONT END RAILS ~OR~ HOW TO USE BLOCKS IN YOUR VIEWS FOR MAXIMUM AMOUNTS OF AWESOMENESS Monday, November 2, 2009
  • 9. a developer working in his views A DEVELOPER http://www.flickr.com/photos/nathonline/918128338 Monday, November 2, 2009
  • 10. a developer working in his views A DEVELOPER http://www.flickr.com/photos/nathonline/918128338 http://www.flickr.com/photos/pipeapple/2190051229 Monday, November 2, 2009
  • 11. create sexy vertical tabs displayed with javascript VERTICAL TABS http://www.flickr.com/photos/denn/5291024/ Monday, November 2, 2009
  • 13. All pages have a couple things in common Monday, November 2, 2009
  • 14. <h1> All pages have a couple things in common Monday, November 2, 2009
  • 15. <h1> <ul> All pages have a couple things in common Monday, November 2, 2009
  • 16. <h1> <ul> All pages have a couple things in common <div> Monday, November 2, 2009
  • 17. <div class='clearfix lead'> <h1>...</h1> <p>...</p> </div> <div id='add_connection' class='add_connection'> <div id='tabs' class='rounded_container'> <ul> <li><a href='#tabs-step1'>1. ...</a></li> <li><a href='#tabs-step2'>2. ...</a></li> <li><a href='#tabs-step3'>3. ...</a></li> <li><a href='#tabs-sync'>4. ...</a></li> <li><a href='#tabs-done'>Finished</a></li> </ul> <div id='tabs-step1' class='setup_box'> <h2>1. ...</h2> ... <a href='#tabs-step2' class='next'>next</a> </div> <div id='tabs-step2' class='setup_box'> <h2>2. ...</h2> ... <a href='#tabs-step1' class='previous'>previous</a> <a href='#tabs-step3' class='next'>next</a> </div> <div id='tabs-step3' class='setup_box'> <h2>3. ...</h2> ... <a href='#tabs-step2' class='previous'>previous</a> <a href='#tabs-sync' class='next'>next</a> </div> <div id='tabs-sync' class='setup_box'> <h2>4. ...</h2> <h3>Status</h3> <p id='status_message'>Checking sync status...</p> <a href='#tabs-step3' class='previous'>previous</a> <a href='#tabs-done' class='next'>next</a> </div> <div id='tabs-done' class='setup_box'> <h2>Finished - Well done!</h2> <img src='/images/giant_success_tick.png' class='success' alt='Success!'> <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a> <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a> <a href='#tabs-sync' class='previous'>previous</a> </div> </div> </div> Monday, November 2, 2009
  • 18. <div class='clearfix lead'> <h1>...</h1> o ts L f <p>...</p> </div> <div id='add_connection' class='add_connection'> o L <div id='tabs' class='rounded_container'> <ul> <li><a href='#tabs-step1'>1. ...</a></li> M <li><a href='#tabs-step2'>2. ...</a></li> <li><a href='#tabs-step3'>3. ...</a></li> T <li><a href='#tabs-sync'>4. ...</a></li> <li><a href='#tabs-done'>Finished</a></li> </ul> H <div id='tabs-step1' class='setup_box'> <h2>1. ...</h2> ... <a href='#tabs-step2' class='next'>next</a> </div> <div id='tabs-step2' class='setup_box'> <h2>2. ...</h2> ... <a href='#tabs-step1' class='previous'>previous</a> <a href='#tabs-step3' class='next'>next</a> </div> <div id='tabs-step3' class='setup_box'> <h2>3. ...</h2> ... <a href='#tabs-step2' class='previous'>previous</a> <a href='#tabs-sync' class='next'>next</a> </div> <div id='tabs-sync' class='setup_box'> <h2>4. ...</h2> <h3>Status</h3> <p id='status_message'>Checking sync status...</p> <a href='#tabs-step3' class='previous'>previous</a> <a href='#tabs-done' class='next'>next</a> </div> <div id='tabs-done' class='setup_box'> <h2>Finished - Well done!</h2> <img src='/images/giant_success_tick.png' class='success' alt='Success!'> <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a> <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a> <a href='#tabs-sync' class='previous'>previous</a> </div> </div> </div> Monday, November 2, 2009
  • 19. <div class='clearfix lead'> <h1>...</h1> o ts L f <p>...</p> </div> <div id='add_connection' class='add_connection'> o L <div id='tabs' class='rounded_container'> <ul> <li><a href='#tabs-step1'>1. ...</a></li> M <li><a href='#tabs-step2'>2. ...</a></li> <li><a href='#tabs-step3'>3. ...</a></li> T <li><a href='#tabs-sync'>4. ...</a></li> <li><a href='#tabs-done'>Finished</a></li> </ul> H <div id='tabs-step1' class='setup_box'> <h2>1. ...</h2> ... <a href='#tabs-step2' class='next'>next</a> </div> <div id='tabs-step2' class='setup_box'> <h2>2. ...</h2> ... <a href='#tabs-step1' class='previous'>previous</a> <a href='#tabs-step3' class='next'>next</a> </div> <div id='tabs-step3' class='setup_box'> Du <h2>3. ...</h2> ... <a href='#tabs-step2' class='previous'>previous</a> pli <a href='#tabs-sync' class='next'>next</a> </div> <div id='tabs-sync' class='setup_box'> <h2>4. ...</h2> ca <h3>Status</h3> <p id='status_message'>Checking sync status...</p> tio <a href='#tabs-step3' class='previous'>previous</a> <a href='#tabs-done' class='next'>next</a> </div> n <div id='tabs-done' class='setup_box'> <h2>Finished - Well done!</h2> <img src='/images/giant_success_tick.png' class='success' alt='Success!'> <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a> <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a> <a href='#tabs-sync' class='previous'>previous</a> </div> </div> </div> Monday, November 2, 2009
  • 20. <div class='clearfix lead'> <h1>...</h1> o ts L f <p>...</p> </div> <div id='add_connection' class='add_connection'> o L <div id='tabs' class='rounded_container'> <ul> <li><a href='#tabs-step1'>1. ...</a></li> M <li><a href='#tabs-step2'>2. ...</a></li> <li><a href='#tabs-step3'>3. ...</a></li> T <li><a href='#tabs-sync'>4. ...</a></li> <li><a href='#tabs-done'>Finished</a></li> </ul> H <div id='tabs-step1' class='setup_box'> <h2>1. ...</h2> ... <a href='#tabs-step2' class='next'>next</a> </div> <div id='tabs-step2' class='setup_box'> <h2>2. ...</h2> ... <a href='#tabs-step1' class='previous'>previous</a> <a href='#tabs-step3' class='next'>next</a> </div> <div id='tabs-step3' class='setup_box'> Du <h2>3. ...</h2> ... <a href='#tabs-step2' class='previous'>previous</a> pli <a href='#tabs-sync' class='next'>next</a> </div> <div id='tabs-sync' class='setup_box'> <h2>4. ...</h2> ca <h3>Status</h3> <p id='status_message'>Checking sync status...</p> tio <a href='#tabs-step3' class='previous'>previous</a> <a href='#tabs-done' class='next'>next</a> </div> n <div id='tabs-done' class='setup_box'> <h2>Finished - Well done!</h2> <img src='/images/giant_success_tick.png' class='success' alt='Success!'> <a href='/connections' class='continue add_more' title='back'><img src='/images/add_connection_btn.png' alt='Go to Contacts' /></a> <a href='/contacts' title='Go to Contacts' class='continue'><img src='/images/gotocontacts_btn.png' alt='Go to Contacts' /></a> <a href='#tabs-sync' class='previous'>previous</a> </div> </div> </div> Monday, November 2, 2009
  • 21. Imagine having to do this 8 times and changing things around Awefull Monday, November 2, 2009
  • 22. HOW COULD THIS BE BETTER? Monday, November 2, 2009
  • 23. And on the 8th day I created methods to awesomify with your views. You shall refer to these as helpers. if we where evil we could misuse rails helpers with blocks to create a nice little DSL we can use everywhere GOD GAVE US HELPERS http://www.flickr.com/photos/zippy/2429678961/ Monday, November 2, 2009
  • 24. And on the 8th day I created methods to awesomify with your views. You shall refer to these as helpers. if we where evil we could misuse rails helpers with blocks to create a nice little DSL we can use everywhere GOD GAVE US HELPERS http://www.flickr.com/photos/zippy/2429678961/ Monday, November 2, 2009
  • 25. And on the 8th day I created methods to awesomify with your views. Kill JAVA! You shall refer to these as helpers. if we where evil we could misuse rails helpers with blocks to create a nice little DSL we can use everywhere GOD GAVE US HELPERS http://www.flickr.com/photos/zippy/2429678961/ Monday, November 2, 2009
  • 26. <% add_connection_tabs(:for => "...", :subtitle => "...") do |tab| %> <% tab.step "..." do %> ... <% end %> <% tab.step "..." do %> ... <% end %> <% tab.step "..." do %> ... <% end %> <% tab.sync %> <% tab.done %> <% end %> Monday, November 2, 2009
  • 27. http://www.flickr.com/photos/bodoggirl/3598561539 http://www.flickr.com/photos/juice10/3501376901 Monday, November 2, 2009
  • 28. x y! Se http://www.flickr.com/photos/bodoggirl/3598561539 http://www.flickr.com/photos/juice10/3501376901 Monday, November 2, 2009
  • 29. LOOKING GOOD HURTS http://www.flickr.com/photos/thenovys/3791884189 Monday, November 2, 2009
  • 30. HOW TO TAKE THE HURT OUT OF LOOKING BEAUTIFUL (ehow.com) 1) Freeze t weezers before t weezing eyebrows, it'll numb the area being t weezed at its touch. 2) Carry those oversized designer purses and totes on different shoulders everyday to avoid straining your arms and shoulder muscles. 3) Make sure to thoroughly stretch your muscles before exercising to increase.. bla bla bla 4) Choose the best fitted high heel or stiletto possible to reduce pain and pressure on your toes (translated – don’t choose a heel that’ll make your foot slide leaving a gap bet ween the shoe and back of your foot). 5) Something about sticking tape on your toes so that your sandals don't eat your feet Monday, November 2, 2009
  • 31. BLOCK_HELPER http://github.com/markevans/block_helpers Dax briefly talked about it yesterday Monday, November 2, 2009
  • 32. wor ks b stick etter y tap than e on stick your ing toes BLOCK_HELPER http://github.com/markevans/block_helpers Dax briefly talked about it yesterday Monday, November 2, 2009
  • 33. THE MEAT http://www.flickr.com/photos/splorp/12200621 Monday, November 2, 2009
  • 34. # config/environment.rb config.gem "block_helpers", :lib => "block_helpers", :source => "http://gemcutter.org" $ rake gems:install Monday, November 2, 2009
  • 35. THE PAGE WE ARE GOING TO DRYUP <h1>Symptoms of Apple addiction</h1> <div id='symptoms'> <ul class="tabs"> <li><a href="#praying_panel">Praying</a></li> <li><a href="#happiness_panel">Happiness</a></li> <li><a href="#microsoft_panel">Microsoft</a></li> </ul> <div class="panes"> <div id="praying_panel"> <h2>Praying to Steve Jobs</h2> <p>It is not uncommon for an Apple addict to pray to his Steveness.</p> </div> <div id="happiness_panel"> <h2>Happiness and iPhone battery level equal</h2> <p>Addict gets the shakes from low battery power</p> </div> <div id="microsoft_panel"> <h2>Microsoft powered nervous break downs</h2> <p>Addict gets the shakes from non-Apple devices</p> </div> </div> </div> Monday, November 2, 2009
  • 36. THE PAGE WE ARE GOING TO DRYUP <h1>Symptoms of Apple addiction</h1> <div id='symptoms'> <ul class="tabs"> <li><a href="#praying_panel">Praying</a></li> <li><a href="#happiness_panel">Happiness</a></li> <li><a href="#microsoft_panel">Microsoft</a></li> </ul> <div class="panes"> <div id="praying_panel"> <h2>Praying to Steve Jobs</h2> <p>It is not uncommon for an Apple addict to pray to his Steveness.</p> </div> <div id="happiness_panel"> <h2>Happiness and iPhone battery level equal</h2> <p>Addict gets the shakes from low battery power</p> </div> <div id="microsoft_panel"> <h2>Microsoft powered nervous break downs</h2> <p>Addict gets the shakes from non-Apple devices</p> </div> </div> </div> Monday, November 2, 2009
  • 37. NO MORE TOWELS NEEDED <% symptom_tabs_for "Apple addiction" do |tabs| %> <% tabs.symptom "Praying to Steve Jobs" do %> <p>It is not uncommon for an Apple addict to pray to his Steveness.</p> <% end %> <% tabs.symptom "Happiness and iPhone energy level equal" do %> <p>Addict gets the shakes from low battery power</p> <% end %> <% tabs.symptom "Microsoft powered nervous break downs" do %> <p>Addict gets the shakes from non-Apple devices</p> <% end %> <% end %> Monday, November 2, 2009
  • 38. ARE WE THERE YET? http://www.flickr.com/photos/sbluerock/415736417 Monday, November 2, 2009
  • 39. NO! SHUT UP OR NO MORE TV! http://www.flickr.com/photos/chubbychandru/2273272995 Monday, November 2, 2009
  • 40. FIRST THINGS FIRST # view.html.erb <% symptom_tabs_for "Apple addiction" do |tabs| %> ... <% end %> # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base # symptom_tabs_for code end end Monday, November 2, 2009
  • 41. # view.html.erb <% symptom_tabs_for "Apple addiction" do |tabs| %> <% tabs.symptom "Praying to Steve Jobs" do %> ... <% end %> ... <% end %> # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) end def symptom(name, &block) end end end Monday, November 2, 2009
  • 42. # view.html.erb <% symptom_tabs_for "Apple addiction" do |tabs| %> ... <% end %> # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end end end Monday, November 2, 2009
  • 43. # view.html.erb <% symptom_tabs_for "Apple addiction" do |tabs| %> ... <% end %> # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end end end Monday, November 2, 2009
  • 44. # view.html.erb <% symptom_tabs_for "Apple addiction" do |tabs| %> ... <% end %> # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end end end Monday, November 2, 2009
  • 45. # view.html.erb <% symptom_tabs_for "Apple addiction" do |tabs| %> ... <% end %> # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end end end Monday, November 2, 2009
  • 46. # view.html.erb <% symptom_tabs_for "Apple addiction" do |tabs| %> ... <% end %> # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end end end # browser <h1>Symptoms of Apple addiction</h1> <div id="symptoms"> <div class="panes"> </div> </div> Monday, November 2, 2009
  • 47. # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def sypmtom(name, &block) @short = name.split.first @content = capture &block concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 48. # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def sypmtom(name, &block) @short = name.split.first @content = capture(&block) concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 49. # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def sypmtom(name, &block) @short = name.split.first @content = capture(&block) concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 50. # application_helper.rb module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def sypmtom(name, &block) @short = name.split.first @content = capture(&block) concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 51. CONCAT concat "hello" # the equivalent of <%= "hello" %> Monday, November 2, 2009
  • 52. CAPTURE <% @greeting = capture do %> Welcome to my shiny new web page! The date and time is <%= Time.now %> <% end %> def myblockheader(&block) content = capture(&block) concat(content_tag('h1', content)) end <% myblockheader do %> Welcome to my shiny new web page! <% end %> Monday, November 2, 2009
  • 53. module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title @tabs = [] end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') + content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def symptom(name, &block) @short = name.split.first @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel") @content = capture &block concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 54. module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title @tabs = [] end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') + content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def symptom(name, &block) @short = name.split.first @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel") @content = capture &block concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 55. module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title @tabs = [] end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') + content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def symptom(name, &block) @short = name.split.first @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel") @content = capture &block concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 56. module ApplicationHelper class SymptomTabsFor < BlockHelpers::Base def initialize(title) @title = title @tabs = [] end def display(body) content_tag('h1', "Symptoms of #{@title}") + content_tag('div', ( content_tag('ul', @tabs.collect{|t| content_tag('li', t)}, :class => 'tabs') + content_tag('div', body, :class => 'panes')), :id => 'symptoms') end def symptom(name, &block) @short = name.split.first @tabs << content_tag('a', @short, :href => "##{@short.downcase}_panel") @content = capture &block concat content_tag('div', ( content_tag( 'h2', name) + @content), :id => "#{@short.downcase}_panel") end end end Monday, November 2, 2009
  • 57. COMMUNITY PLUG dev-groups.org rubyists.eu http://amsterdam-rb.org/ http://groups.google.com/group/utrecht-rb Monday, November 2, 2009
  • 59. JUSTIN HALSALL blog: juice10.com pet project: tvnotify.com twitter.com/juice10 wakoopa.com/juice10 github.com/Juice10 Monday, November 2, 2009