public
Description: Makes your models act as textiled.
Homepage: http://errtheblog.com/posts/12-actsastextiled
Clone URL: git://github.com/defunkt/acts_as_textiled.git
Search Repo:
defunkt (author)
Tue Aug 21 15:38:04 -0700 2007
commit  3869d8ea49c7edbcc37685f362838d66966727d9
tree    6bb0b484f8b16a2c5ea48eec1daa8f1508fd6e85
parent  572cc436e2bcf5ead694cc962a5808e1e2456cf0
name age message
folder CHANGES Sun Jun 03 04:35:21 -0700 2007 add in acts_as_textiled api changes [defunkt]
folder LICENSE Wed Aug 09 22:22:32 -0700 2006 initial import [defunkt]
folder README Tue Aug 21 15:38:04 -0700 2007 yet more rdoc changes [defunkt]
folder Rakefile Tue Aug 21 15:38:04 -0700 2007 yet more rdoc changes [defunkt]
folder about.yml Sun Jun 03 04:35:21 -0700 2007 add in acts_as_textiled api changes [defunkt]
folder init.rb Wed Jun 13 08:48:48 -0700 2007 acts_as_textiled: Fail to load RedCloth gracefu... [defunkt]
folder lib/ Sun Jun 03 04:35:21 -0700 2007 add in acts_as_textiled api changes [defunkt]
folder test/ Sun Jun 03 04:35:21 -0700 2007 add in acts_as_textiled api changes [defunkt]
README
= Acts as Textiled

This simple plugin allows you to forget about constantly rendering Textile in 
your application.  Instead, you can rest easy knowing the Textile fields you 
want to display as HTML will always be displayed as HTML (unless you tell your
code otherwise).

No database modifications are needed.

You need RedCloth, of course.  And Rails.

== Usage

  class Story < ActiveRecord::Base
    acts_as_textiled :body_text, :description
  end

  >> story = Story.find(3)
  => #<Story:0x245fed8 ... >

  >> story.description
  => "<p>This is <strong>cool</strong>.</p>"

  >> story.description(:source)
  => "This is *cool*."

  >> story.description(:plain)
  => "This is cool."

  >> story.description = "I _know_!"
  => "I _know_!"

  >> story.save
  => true

  >> story.description
  => "<p>I <em>know</em>!</p>"

  >> story.textiled = false
  => false

  >> story.description
  => "I _know_!"

  >> story.textiled = true
  => true

  >> story.description
  => "<p>I <em>know</em>!</p>"

== Different Modes

RedCloth supports different modes, such as :lite_mode.  To use a mode on 
a specific attribute simply pass it in as an options hash after any
attributes you don't want to mode-ify.  Like so:

  class Story < ActiveRecord::Base
    acts_as_textiled :body_text, :description => :lite_mode
  end

Or:

  class Story < ActiveRecord::Base
    acts_as_textiled :body_text => :lite_mode, :description => :lite_mode
  end

You can also pass in multiple modes per attribute:

  class Story < ActiveRecord::Base
    acts_as_textiled :body_text, :description => [ :lite_mode, :no_span_caps ]
  end

Get it?  Now let's say you have an admin tool and you want the text to be displayed
in the text boxes / fields as plaintext.  Do you have to change all your views?  

Hell no.

== form_for

Are you using form_for?  If you are, you don't have to change any code at all.

  <% form_for :story, @story do |f| %>
    Description: <br/> <%= f.text_field :description %>
  <% end %>

You'll see the Textile plaintext in the text field.  It Just Works.

== form tags

If you're being a bit unconvential, no worries.  You can still get at your 
raw Textile like so:

  Description: <br/> <%= text_field_tag :description, @story.description(:source) %>

And there's always object.textiled = false, as demo'd above.

== Pre-fetching

acts_as_textiled locally caches rendered HTML once the attribute in question has 
been requested.  Obviously this doesn't bode well for marshalling or caching.

If you need to force your object to build and cache HTML for all textiled attributes,
call the +textilize+ method on your object.

If you're real crazy you can even do something like this:

  class Story < ActiveRecord::Base
    acts_as_textiled :body_text, :description

    def after_find
      textilize
    end
  end

All your Textile will now be ready to go in spiffy HTML format.  But you probably
won't need to do this.

Enjoy.

* By Chris Wanstrath [ chris[at]ozmm[dot]org ]