Languages

Fsharp
ActionScript
xBase
Clean
GPSS
PureBasic
Sieve
Erlang
JOVIAL
Mercury
Linda
DataFlex
PostScript
FoxPro2
VFP
Cobol
Prolog
Jython
Awk
VisualBasic
JavaScript
Matlab
ASP
Haskell
Csharp
D
Smalltalk
Nemerle
Pixilang
Java
SQL
Python
ObjectPascal
Ruby
Perl
Pascal
Assembler
PHP
C
Functions  Add function  Users  Registration  Enter   About  ASCII Table  Our helpers

Ruby-on-Rails


1 Handling Cookies and DHTML Effects with Ruby on Rails

2 15.13 Extracting Code into Helper Functions

3 15.14 Refactoring the View into Partial Snippets of Views

4 15.15 Adding DHTML Effects with script.aculo.us

15.13 Extracting Code into Helper Functions



(Page 2 of 4 )

Problem

Your views are getting cluttered with Ruby code.

Solution

Let_s create a controller with a fairly complex view to see how this can happen: 

  $ ./scripts/generate controller list index
        exists  app/controllers/
        exists  app/helpers/
        create  app/views/list
        exists  test/functional/
        create  app/controllers/ list_controller.rb
        create  test/functional/ list_controller_test.rb
        create  app/helpers/list_helper.rb
        create  app/views/list/index.rhtml

Edit app/controllers/list_controller.rb to look like this:

  class ListController < ApplicationController
    def index
      @list = [1, "string", :symbol, [_list_]]
    end
  end

Edit app/views/list/index.rhtml to contain the following code. It iterates over each element in @list, and prints out its index and the SHA1 hash of its object ID:

  <!-- app/views/list/index.rhtml -->
  <ul>
  <% @list.each_with_index do |item, i| %>
    <li class="<%= i%2==0 ? _even_ : _odd_ %>"><%= i %>:
     
<%= SHA1.new(item.id.to_s) %></li>
  <% end %>
  </ul>

This is pretty messy, but if you_ve done much web programming it should also look sadly familiar.

To clean up this code, we_re going to move some of it into the helper for the controller. In this case, the controller is called list, so its helper lives in app/helpers/list_helper.rb.

Let_s create a helper function called create_li. Given an object and its position in the list, this function creates an <LI> tag suitable for use in the index view:

  module ListHelper
    def create_li(item, i)
      %{<li class="#{ i%2==0 ? _even_ : _odd_ }">#{i}:
        #{SHA1.new(item.id.to_s)}</li>}
    end
  end

The list controller_s views have access to all the functions defined in ListHelper. We can clean up the index view like so:

  <!-- app/views/list/index.rhtml -->
  <ul>
  <% @list.each_with_index do |item, i| %>
    <%= create_li(item, i) %>
  <% end %>
  </ul>

Your helper functions can do anything you can normally do from within a view, so they are a great way to abstract out the heavy lifting.

Discussion

The purpose of helper functions is to create more maintainable code, and to enforce a good division of labor between the programmers and the UI designers. Maintainable code is easier for the programmers to work on, and when it_s in helper functions it_s out of the way of the designers, who can tweak the HTML here and there without having to sifting through code.

A good rule of thumb for when to use helpers is to read the code aloud. If it sounds like nonsense to someone familiar with HTML, or it makes up more than a short English sentence, hide it in a helper.

The flip side of this is that you should minimize the amount of HTML generated from within the helpers. That way the UI designers, or other people familiar with HTML, won_t wander your code, wondering where to find the bit of HTML that needs tweaking.

Although helper functions are useful and used very often, Rails also provides partials, another way of extracting code into smaller chunks.

See Also


1 2 3 4
Frog Killer Caught in the Act

Photo of a Panamanian golden frog.

A killer has been caught in the act: the first before-and-after view of an infectious disease that led to an amphibian die-off has been released by the scientists who tracked it.

The results are published this week in the journal Proceedings of the National Academy of Sciences (PNAS).

Like a wave, incidence of the fungal disease that wipes out Central American frogs--chytridiomycosis--advances through the region's highlands at a rate of about 30 kilometers ...

More at http://www.nsf.gov/news/news_summ.jsp?cntn_id=117348&WT.mc_id=USNSF_51&WT.mc_ev=click


This is an NSF News item.

PycckaR
BepcuR


Articles
Articles


Library
Library


Downloads
Downloads

Google Chrome Golf 6
 © Internet, books, teachers and Rudevich Alexander brains.