diff options
author | Sam Stephenson <sam@37signals.com> | 2006-01-23 06:52:26 +0000 |
---|---|---|
committer | Sam Stephenson <sam@37signals.com> | 2006-01-23 06:52:26 +0000 |
commit | 84361478256f620cc3c4d31235eeec28bba058f0 (patch) | |
tree | 2b264f894cb9f052e72e3dec17e509ac72c0c617 | |
parent | d921b799747aacb47dc8bbca9b2eefe25159e9d5 (diff) | |
download | rails-84361478256f620cc3c4d31235eeec28bba058f0.tar.gz rails-84361478256f620cc3c4d31235eeec28bba058f0.tar.bz2 rails-84361478256f620cc3c4d31235eeec28bba058f0.zip |
Add the ability to call JavaScriptGenerator methods from helpers called in update blocks
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3470 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
-rw-r--r-- | actionpack/CHANGELOG | 14 | ||||
-rwxr-xr-x | actionpack/lib/action_controller/base.rb | 5 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/prototype_helper.rb | 58 |
3 files changed, 61 insertions, 16 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index bf00979083..7476c736ac 100644 --- a/actionpack/CHANGELOG +++ b/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] diff --git a/actionpack/lib/action_controller/base.rb b/actionpack/lib/action_controller/base.rb index 0a9368f684..7f8ff5ed09 100755 --- a/actionpack/lib/action_controller/base.rb +++ b/actionpack/lib/action_controller/base.rb @@ -687,7 +687,7 @@ module ActionController #:nodoc: 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 @@ module ActionController #:nodoc: @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. diff --git a/actionpack/lib/action_view/helpers/prototype_helper.rb b/actionpack/lib/action_view/helpers/prototype_helper.rb index d35334a98c..edf6f50a06 100644 --- a/actionpack/lib/action_view/helpers/prototype_helper.rb +++ b/actionpack/lib/action_view/helpers/prototype_helper.rb @@ -370,34 +370,52 @@ module ActionView # 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 @@ module ActionView 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 |