Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Add the ability to call JavaScriptGenerator methods from helpers call…

…ed in update blocks

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3470 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
commit 84361478256f620cc3c4d31235eeec28bba058f0 1 parent d921b79
@sstephenson sstephenson authored
View
14 actionpack/CHANGELOG
@@ -1,5 +1,19 @@
*SVN*
+* Add the ability to call JavaScriptGenerator methods from helpers called in update blocks. [Sam Stephenson] Example:
+ module ApplicationHelper
+ def update_time
+ page.replace_html 'time', Time.now.to_s(:db)
+ page.visual_effect :highlight, 'time'
+ end
+ end
+
+ class UserController < ApplicationController
+ def poll
+ render :update { |page| page.update_time }
+ end
+ end
+
* Fixed that SSL would not correctly be detected when running lighttpd/fcgi behind lighttpd w/mod_proxy #3548 [stephen_purcell@yahoo.com]
* Added the possibility to specify atomatic expiration for the memcachd session container #3571 [Stefan Kaes]
View
5 actionpack/lib/action_controller/base.rb
@@ -687,7 +687,7 @@ def render_text(text = nil, status = nil)
end
def render_javascript(javascript, status = nil)
- @response.headers['Content-type'] = 'text/javascript'
+ @response.headers['Content-Type'] = 'text/javascript'
render_text(javascript, status)
end
@@ -719,7 +719,8 @@ def erase_render_results
@response.body = nil
@performed_render = false
end
-
+
+
# Clears the redirected results from the headers, resets the status to 200 and returns
# the URL that was used to redirect or nil if there was no redirected URL
# Note that +redirect_to+ will change the body of the response to indicate a redirection.
View
58 actionpack/lib/action_view/helpers/prototype_helper.rb
@@ -370,34 +370,52 @@ def observe_form(form_id, options = {})
# 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, then call
- # #insert_html, #replace_html, #remove, #show, or #hide on the yielded
- # generator in any order you like to modify the content and appearance of
- # the current page. (You can also call other helper methods which
- # return JavaScript, such as
- # ActionView::Helpers::ScriptaculousHelper#visual_effect.)
+ # 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>Last item</li>'
+ # 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>Last item</li>");
+ # 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.
class JavaScriptGenerator
- def initialize(context) #:nodoc:
+ def initialize(context, &block) #:nodoc:
@context, @lines = context, []
- yield self
+ include_helpers_from_context
+ @context.instance_exec(self, &block)
end
def to_s #:nodoc:
@@ -501,12 +519,24 @@ def delay(seconds = 1)
yield
record "}, #{(seconds * 1000).to_i})"
end
-
+
+ # Starts a Scriptaculous visual effect. See
+ # ActionView::Helpers::ScriptaculousHelper for more information.
+ def visual_effect(name, id, options = {})
+ record ScriptaculousHelper::visual_effect(name, id, options)
+ end
+
private
- def method_missing(method, *arguments, &block)
- record(@context.send(method, *arguments, &block))
+ def include_helpers_from_context
+ @context.extended_by.each do |mod|
+ extend mod unless mod.name =~ /^ActionView::Helpers/
+ end
end
-
+
+ def page
+ self
+ end
+
def record(line)
returning line = "#{line.to_s.chomp.gsub /\;$/, ''};" do
self << line
Please sign in to comment.
Something went wrong with that request. Please try again.