Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Ticket #933: ajax_render.rb

File ajax_render.rb, 2.8 kB (added by freedumb, 4 years ago)

Helper module for the controller. Provides #render_ajax and #render_ajax_to_string .

Line 
1 module AjaxRender
2    
3       #original code by dgm. modied by Gunther Schulz (freedumb on freenode).
4      
5       # helper function to render a javascript command to the client.
6       # options hash should have:
7                         # :template => erb template. If omitted the default template for the action is used.
8       # :action => (:insert, :replace, :delete, :empty, :formfill).
9                         # on :replace all elements with a tag name of 'javascript'  will be evaled in the client.
10       # :target => DOM element. (string name)
11       # :position => (:before, :top, :bottom, :after)
12       #   postion is only used in the insert routines
13       # :formobject => ActiveRecord Object - values to fill into form
14       #   :formobject is used only by :formfill action
15                        
16         def render_ajax(options)
17                 render_text render_ajax_to_string(options)
18         end
19        
20         def render_ajax_to_string(options)
21                                
22                                 if options[:template]
23                                         text = escape_javascript(render_to_string(options[:template]))
24                                 else
25           text = escape_javascript(render_to_string)
26                                 end
27                                
28         case options[:action]
29           when :insert
30             case options[:position]
31               when :before
32                 "new Insertion.Before('#{options[:target]}', '#{text}');"
33               when :top
34                "new Insertion.Top('#{options[:target]}', '#{text}');"
35               when :bottom
36                 "new Insertion.Bottom('#{options[:target]}', '#{text}');"
37               when :after
38                 "new Insertion.After('#{options[:target]}', '#{text}');"
39               else
40                 raise ArgumentError, "Invalid position, choose one of :before, :top, :bottom, :after"
41             end
42           when :replace
43             "$('#{options[:target]}').innerHTML = '#{text}'; for (i = 0; i < #{options[:target]}.getElementsByTagName('script').length; ++i){eval(#{options[:target]}.getElementsByTagName('script')[i].firstChild.data)};"         
44           when :empty
45             "$('#{options[:target]}').innerHTML = '';"
46           when :delete
47             "$('#{options[:target]}').parentNode.removeChild($('#{options[:target]}'));"
48           when :formfill
49             raise ArgumentError, ":formfill requires :formobject" unless options[:formobject]
50             ret = ''
51            objectname = options[:formobject].class.to_s.underscore
52             for key,value in options[:formobject].attributes
53               ret << "$('#{objectname}_#{key}').value = '#{escape_javascript(value.to_s)}';\n"
54             end
55             return ret
56           else
57             raise ArgumentError, "Invalid action, choose one of :insert, :replace, :delete, :empty, :formfill"
58         end
59                                
60       end
61                
62         def escape_javascript(javascript)
63          javascript.gsub(/\r\n|\n|\r/, "\\n").gsub(/["']/) { |m| "\\#{m}" }
64         end
65                
66 end