Module ActionView::Helpers::PrototypeHelper::JavaScriptGenerator::GeneratorMethods
In: actionpack/lib/action_view/helpers/prototype_helper.rb

JavaScriptGenerator generates blocks of JavaScript code that allow you to change the content and presentation of multiple DOM elements. Use this in your Ajax response bodies, either in a <script> tag or as plain JavaScript sent with a Content-type of "text/javascript".

Create new instances with PrototypeHelper#update_page or with ActionController::Base#render, then call insert_html, replace_html, remove, show, hide, visual_effect, or any other of the built-in methods on the yielded generator in any order you like to modify the content and appearance of the current page.

Example:

  update_page do |page|
    page.insert_html :bottom, 'list', "<li>#{@item.name}</li>"
    page.visual_effect :highlight, 'list'
    page.hide 'status-indicator', 'cancel-link'
  end

generates the following JavaScript:

  new Insertion.Bottom("list", "<li>Some item</li>");
  new Effect.Highlight("list");
  ["status-indicator", "cancel-link"].each(Element.hide);

Helper methods can be used in conjunction with JavaScriptGenerator. When a helper method is called inside an update block on the page object, that method will also have access to a page object.

Example:

  module ApplicationHelper
    def update_time
      page.replace_html 'time', Time.now.to_s(:db)
      page.visual_effect :highlight, 'time'
    end
  end

  # Controller action
  def poll
    render(:update) { |page| page.update_time }
  end

You can also use PrototypeHelper#update_page_tag instead of PrototypeHelper#update_page to wrap the generated JavaScript in a <script> tag.

Methods

Public Instance methods

Writes raw JavaScript to the page.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 620
          def <<(javascript)
            @lines << javascript
          end

Returns a element reference by finding it through id in the DOM. This element can then be used for further method calls. Examples:

  page['blank_slate']                  # => $('blank_slate');
  page['blank_slate'].show             # => $('blank_slate').show();
  page['blank_slate'].show('first').up # => $('blank_slate').show('first').up();

You can also pass in a record, which will use ActionController::RecordIdentifier.dom_id to lookup the correct id:

  page[@post]     # => $('post_45')
  page[Post.new]  # => $('new_post')

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 465
          def [](id)
            case id
              when String, Symbol, NilClass
                JavaScriptElementProxy.new(self, id)
              else
                JavaScriptElementProxy.new(self, ActionController::RecordIdentifier.dom_id(id))
            end
          end

Displays an alert dialog with the given message.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 596
          def alert(message)
            call 'alert', message
          end

Assigns the JavaScript variable the given value.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 615
          def assign(variable, value)
            record "#{variable} = #{javascript_object_for(value)}"
          end

Calls the JavaScript function, optionally with the given arguments.

If a block is given, the block will be passed to a new JavaScriptGenerator; the resulting JavaScript code will then be wrapped inside function() { … } and passed as the called function’s final argument.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 610
          def call(function, *arguments, &block)
            record "#{function}(#{arguments_for_call(arguments, block)})"
          end

Executes the content of the block after a delay of seconds. Example:

  page.delay(20) do
    page.visual_effect :fade, 'notice'
  end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 629
          def delay(seconds = 1)
            record "setTimeout(function() {\n\n"
            yield
            record "}, #{(seconds * 1000).to_i})"
          end

Creates a script.aculo.us draggable element. See ActionView::Helpers::ScriptaculousHelper for more information.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 651
          def draggable(id, options = {})
            record @context.send(:draggable_element_js, id, options)
          end

Creates a script.aculo.us drop receiving element. See ActionView::Helpers::ScriptaculousHelper for more information.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 657
          def drop_receiving(id, options = {})
            record @context.send(:drop_receiving_element_js, id, options)
          end

Hides the visible DOM elements with the given ids.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 586
          def hide(*ids)
            loop_on_multiple_args 'Element.hide', ids           
          end

Inserts HTML at the specified position relative to the DOM element identified by the given id.

position may be one of:

:top:HTML is inserted inside the element, before the element’s existing content.
:bottom:HTML is inserted inside the element, after the element’s existing content.
:before:HTML is inserted immediately preceding the element.
:after:HTML is inserted immediately following the element.

options_for_render may be either a string of HTML to insert, or a hash of options to be passed to ActionView::Base#render. For example:

  # Insert the rendered 'navigation' partial just before the DOM
  # element with ID 'content'.
  insert_html :before, 'content', :partial => 'navigation'

  # Add a list item to the bottom of the <ul> with ID 'list'.
  insert_html :bottom, 'list', '<li>Last item</li>'

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 527
          def insert_html(position, id, *options_for_render)
            insertion = position.to_s.camelize
            call "new Insertion.#{insertion}", id, render(*options_for_render)
          end

Returns an object whose to_json evaluates to code. Use this to pass a literal JavaScript expression as an argument to another JavaScriptGenerator method.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 476
          def literal(code)
            ActiveSupport::JSON::Variable.new(code.to_s)
          end

Redirects the browser to the given location, in the same form as url_for.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 601
          def redirect_to(location)
            assign 'window.location.href', @context.url_for(location)
          end

Removes the DOM elements with the given ids from the page.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 576
          def remove(*ids)
            loop_on_multiple_args 'Element.remove', ids
          end

Replaces the "outer HTML" (i.e., the entire element, not just its contents) of the DOM element with the given id.

options_for_render may be either a string of HTML to insert, or a hash of options to be passed to ActionView::Base#render. For example:

  # Replace the DOM element having ID 'person-45' with the
  # 'person' partial for the appropriate object.
  replace 'person-45', :partial => 'person', :object => @person

This allows the same partial that is used for the insert_html to be also used for the input to replace without resorting to the use of wrapper elements.

Examples:

  <div id="people">
    <%= render :partial => 'person', :collection => @people %>
  </div>

  # Insert a new person
  page.insert_html :bottom, :partial => 'person', :object => @person

  # Replace an existing person
  page.replace 'person_45', :partial => 'person', :object => @person

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 571
          def replace(id, *options_for_render)
            call 'Element.replace', id, render(*options_for_render)
          end

Replaces the inner HTML of the DOM element with the given id.

options_for_render may be either a string of HTML to insert, or a hash of options to be passed to ActionView::Base#render. For example:

  # Replace the HTML of the DOM element having ID 'person-45' with the
  # 'person' partial for the appropriate object.
  replace_html 'person-45', :partial => 'person', :object => @person

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 541
          def replace_html(id, *options_for_render)
            call 'Element.update', id, render(*options_for_render)
          end

Returns a collection reference by finding it through a CSS pattern in the DOM. This collection can then be used for further method calls. Examples:

  page.select('p')                      # => $$('p');
  page.select('p.welcome b').first      # => $$('p.welcome b').first();
  page.select('p.welcome b').first.hide # => $$('p.welcome b').first().hide();

You can also use prototype enumerations with the collection. Observe:

  page.select('#items li').each do |value|
    value.hide
  end
  # => $$('#items li').each(function(value) { value.hide(); });

Though you can call the block param anything you want, they are always rendered in the javascript as ‘value, index.’ Other enumerations, like collect() return the last statement:

  page.select('#items li').collect('hidden') do |item|
    item.hide
  end
  # => var hidden = $$('#items li').collect(function(value, index) { return value.hide(); });

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 501
          def select(pattern)
            JavaScriptElementCollectionProxy.new(self, pattern)
          end

Shows hidden DOM elements with the given ids.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 581
          def show(*ids)
            loop_on_multiple_args 'Element.show', ids
          end

Creates a script.aculo.us sortable element. Useful to recreate sortable elements after items get added or deleted. See ActionView::Helpers::ScriptaculousHelper for more information.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 645
          def sortable(id, options = {})
            record @context.send(:sortable_element_js, id, options)
          end

Toggles the visibility of the DOM elements with the given ids.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 591
          def toggle(*ids)
            loop_on_multiple_args 'Element.toggle', ids            
          end

Starts a script.aculo.us visual effect. See ActionView::Helpers::ScriptaculousHelper for more information.

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 637
          def visual_effect(name, id = nil, options = {})
            record @context.send(:visual_effect, name, id, options)
          end

Private Instance methods

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 692
            def arguments_for_call(arguments, block = nil)
              arguments << block_to_function(block) if block
              arguments.map { |argument| javascript_object_for(argument) }.join ', '
            end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 697
            def block_to_function(block)
              generator = self.class.new(@context, &block)
              literal("function() { #{generator.to_s} }")
            end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 688
            def javascript_object_for(object)
              object.respond_to?(:to_json) ? object.to_json : object.inspect
            end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 662
            def loop_on_multiple_args(method, ids)
              record(ids.size>1 ? 
                "#{javascript_object_for(ids)}.each(#{method})" : 
                "#{method}(#{ids.first.to_json})")
            end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 702
            def method_missing(method, *arguments)
              JavaScriptProxy.new(self, method.to_s.camelize)
            end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 668
            def page
              self
            end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 672
            def record(line)
              returning line = "#{line.to_s.chomp.gsub(/\;\z/, '')};" do
                self << line
              end
            end

[Source]

# File actionpack/lib/action_view/helpers/prototype_helper.rb, line 678
            def render(*options_for_render)
              old_format = @context && @context.template_format
              @context.template_format = :html if @context
              Hash === options_for_render.first ? 
                @context.render(*options_for_render) : 
                  options_for_render.first.to_s
            ensure
              @context.template_format = old_format if @context
            end

[Validate]