Module: ActionView::Helpers::FormHelper

Defined in:
lib/helpers/default.rb

Instance Method Summary collapse

Instance Method Details

#textile_editor(object_name, method, options = {}) ⇒ Object

Returns a textarea opening and closing tag set tailored for accessing a specified attribute (identified by method) on an object assigned to the template (identified by object). Additional options on the input tag can be passed as a hash with options and places the textile toolbar above it

Examples

textile_editor(:post, :body, :cols => 20, :rows => 40)
# => <textarea cols="20" rows="40" id="post_body" name="post[body]">
#      #{@post.body}
#    </textarea>

textile_editor(:comment, :text, :size => "20x30")
# => <textarea cols="20" rows="30" id="comment_text" name="comment[text]">
#      #{@comment.text}
#    </textarea>

textile_editor(:application, :notes, :cols => 40, :rows => 15, :class => 'app_input')
# => <textarea cols="40" rows="15" id="application_notes" name="application[notes]" class="app_input">
#      #{@application.notes}
#    </textarea>

textile_editor(:entry, :body, :size => "20x20", :disabled => 'disabled')
# => <textarea cols="20" rows="20" id="entry_body" name="entry[body]" disabled="disabled">
#      #{@entry.body}
#    </textarea>


41
42
43
44
45
46
47
48
# File 'lib/helpers/default.rb', line 41

def textile_editor(object_name, method, options = {})        
  editor_id = options[:id] || '%s_%s' % [object_name, method]
  mode      = options.delete(:simple) ? 'simple' : 'extended'
  (@textile_editor_ids ||= []) << [editor_id.to_s, mode.to_s]

  #ActiveModelInstanceTag.new(object_name, method, self, options.delete(:object)).to_text_area_tag(options)
  Tags::TextArea.new(object_name, method, self, options).render
end

#textile_editor_button(text, options = {}) ⇒ Object

registers a new button for the Textile Editor toolbar Parameters:

* +text+: text to display (contents of button tag, so HTML is valid as well)
* +options+: options Hash as supported by +content_tag+ helper in Rails

Example:

The following example adds a button labeled 'Greeting' which triggers an
alert:

<% textile_editor_button 'Greeting', :onclick => "alert('Hello!')" %>

Note: this method must be called before textile_editor_initialize



74
75
76
77
78
79
# File 'lib/helpers/default.rb', line 74

def textile_editor_button(text, options={})
  return textile_editor_button_separator  if text == :separator
  button = (:button, text, options)
  button = "TextileEditor.buttons.push(\"%s\");" % escape_javascript(button)
  (@textile_editor_buttons ||= []) << button
end

#textile_editor_button_separator(options = {}) ⇒ Object



81
82
83
84
# File 'lib/helpers/default.rb', line 81

def textile_editor_button_separator(options={})
  button = "TextileEditor.buttons.push(new TextileEditorButtonSeparator('%s'));" % (options[:simple] || '')
  (@textile_editor_buttons ||= []) << button
end

#textile_editor_initialize(*dom_ids) ⇒ Object

adds the necessary javascript include tags, stylesheet tags, and load event with necessary javascript to active textile editor(s) sample output:

<link href="/stylesheets/textile-editor.css" media="screen" rel="Stylesheet" type="text/css" />
<script src="/javascripts/textile-editor.js" type="text/javascript"></script>
<script type="text/javascript">
document.observe('dom:loaded', function() {
TextileEditor.initialize('article_body', 'extended');
TextileEditor.initialize('article_body_excerpt', 'simple');
});
</script>

Note: in the case of this helper being called via AJAX, the output will be reduced:

<script type="text/javascript">
TextileEditor.initialize('article_body', 'extended');
TextileEditor.initialize('article_body_excerpt', 'simple');
</script>

This means that the support files must be loaded outside of the AJAX request, either via a call to this helper or the textile_editor_support() helper



113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
# File 'lib/helpers/default.rb', line 113

def textile_editor_initialize(*dom_ids)
  options = textile_editor_options.dup

  # extract options from last argument if it's a hash
  if dom_ids.last.is_a?(Hash)
    hash = dom_ids.last.dup
    options.merge! hash
    dom_ids.last.delete :framework
  end

  editor_ids = (@textile_editor_ids || []) + textile_extract_dom_ids(*dom_ids)
  editor_buttons = (@textile_editor_buttons || [])
  output = []
  output << textile_editor_support unless request.xhr?
  output << '<script type="text/javascript">'
  output << '/* <![CDATA[ */'
  
  if !request.xhr?
    case options[:framework]
    when :prototype
      output << %{document.observe('dom:loaded', function() \{}
    when :jquery
      output << %{jQuery(document).ready(function($) \{}
    end
  end      

  # output << %q{TextileEditor.framework = '%s';} % options[:framework].to_s
  output << editor_buttons.join("\n") if editor_buttons.any?
  editor_ids.each do |editor_id, mode|
    output << %q{TextileEditor.initialize('%s', '%s');} % [editor_id, mode || 'extended']
  end
  output << '});' unless request.xhr?

  output << '/* ]]> */'
  output << '</script>'
  output.join("\n").html_safe
end

#textile_editor_options(options = {}) ⇒ Object



50
51
52
# File 'lib/helpers/default.rb', line 50

def textile_editor_options(options={})
  (@textile_editor_options ||= { :framework => :prototype }).merge! options
end

#textile_editor_supportObject



54
55
56
57
58
59
60
# File 'lib/helpers/default.rb', line 54

def textile_editor_support
  output = []
  output << stylesheet_link_tag('textile-editor') 
  output << javascript_include_tag('textile-editor')
	output << javascript_include_tag('textile-editor-config')
  output.join("\n").html_safe
end

#textile_extract_dom_ids(*dom_ids) ⇒ Object



86
87
88
89
90
91
# File 'lib/helpers/default.rb', line 86

def textile_extract_dom_ids(*dom_ids)
  hash = dom_ids.last.is_a?(Hash) ? dom_ids.pop : {}
  hash.inject(dom_ids) do |ids, (object, fields)|
    ids + Array(fields).map { |field| "%s_%s" % [object, field] }
  end
end