New Version
Sync with Latest Instiki Trunk. Migrate to Rails 1.2.5. Bump version number.
This commit is contained in:
parent
de125367b0
commit
207fb1f7f2
120 changed files with 2592 additions and 662 deletions
44
vendor/rails/actionpack/lib/action_view/base.rb
vendored
44
vendor/rails/actionpack/lib/action_view/base.rb
vendored
|
@ -148,7 +148,7 @@ module ActionView #:nodoc:
|
|||
#
|
||||
# This refreshes the sidebar, removes a person element and highlights the user list.
|
||||
#
|
||||
# See the ActionView::Helpers::PrototypeHelper::JavaScriptGenerator documentation for more details.
|
||||
# See the ActionView::Helpers::PrototypeHelper::GeneratorMethods documentation for more details.
|
||||
class Base
|
||||
include ERB::Util
|
||||
|
||||
|
@ -160,7 +160,7 @@ module ActionView #:nodoc:
|
|||
attr_internal *ActionController::Base::DEPRECATED_INSTANCE_VARIABLES
|
||||
|
||||
# Specify trim mode for the ERB compiler. Defaults to '-'.
|
||||
# See ERB documentation for suitable values.
|
||||
# See ERb documentation for suitable values.
|
||||
@@erb_trim_mode = '-'
|
||||
cattr_accessor :erb_trim_mode
|
||||
|
||||
|
@ -191,17 +191,17 @@ module ActionView #:nodoc:
|
|||
end
|
||||
include CompiledTemplates
|
||||
|
||||
# maps inline templates to their method names
|
||||
# Maps inline templates to their method names
|
||||
@@method_names = {}
|
||||
# map method names to their compile time
|
||||
# Map method names to their compile time
|
||||
@@compile_time = {}
|
||||
# map method names to the names passed in local assigns so far
|
||||
# Map method names to the names passed in local assigns so far
|
||||
@@template_args = {}
|
||||
# count the number of inline templates
|
||||
# Count the number of inline templates
|
||||
@@inline_template_count = 0
|
||||
# maps template paths without extension to their file extension returned by pick_template_extension.
|
||||
# if for a given path, path.ext1 and path.ext2 exist on the file system, the order of extensions
|
||||
# used by pick_template_extension determines whether ext1 or ext2 will be stored
|
||||
# Maps template paths without extension to their file extension returned by pick_template_extension.
|
||||
# If for a given path, path.ext1 and path.ext2 exist on the file system, the order of extensions
|
||||
# used by pick_template_extension determines whether ext1 or ext2 will be stored.
|
||||
@@cached_template_extension = {}
|
||||
|
||||
class ObjectWrapper < Struct.new(:value) #:nodoc:
|
||||
|
@ -305,7 +305,6 @@ module ActionView #:nodoc:
|
|||
# Render the provided template with the given local assigns. If the template has not been rendered with the provided
|
||||
# local assigns yet, or if the template has been updated on disk, then the template will be compiled to a method.
|
||||
#
|
||||
|
||||
# Either, but not both, of template and file_path may be nil. If file_path is given, the template
|
||||
# will only be read if it has to be compiled.
|
||||
#
|
||||
|
@ -371,10 +370,12 @@ module ActionView #:nodoc:
|
|||
end
|
||||
|
||||
private
|
||||
# Builds a string holding the full path of the template including extension
|
||||
def full_template_path(template_path, extension)
|
||||
"#{@base_path}/#{template_path}.#{extension}"
|
||||
end
|
||||
|
||||
# Asserts the existence of a template.
|
||||
def template_exists?(template_path, extension)
|
||||
file_path = full_template_path(template_path, extension)
|
||||
@@method_names.has_key?(file_path) || FileTest.exists?(file_path)
|
||||
|
@ -389,6 +390,7 @@ module ActionView #:nodoc:
|
|||
@@cache_template_extensions && @@cached_template_extension[template_path]
|
||||
end
|
||||
|
||||
# Determines the template's file extension, such as rhtml, rxml, or rjs.
|
||||
def find_template_extension_for(template_path)
|
||||
if match = delegate_template_exists?(template_path)
|
||||
match.first.to_sym
|
||||
|
@ -405,6 +407,7 @@ module ActionView #:nodoc:
|
|||
File.read(template_path)
|
||||
end
|
||||
|
||||
# Evaluate the local assigns and pushes them to the view.
|
||||
def evaluate_assigns
|
||||
unless @assigns_added
|
||||
assign_variables_from_controller
|
||||
|
@ -416,6 +419,7 @@ module ActionView #:nodoc:
|
|||
handler.new(self).render(template, local_assigns)
|
||||
end
|
||||
|
||||
# Assigns instance variables from the controller to the view.
|
||||
def assign_variables_from_controller
|
||||
@assigns.each { |key, value| instance_variable_set("@#{key}", value) }
|
||||
end
|
||||
|
@ -427,10 +431,10 @@ module ActionView #:nodoc:
|
|||
((args = @@template_args[render_symbol]) && local_assigns.all? { |k,_| args.has_key?(k) })
|
||||
end
|
||||
|
||||
# Check whether compilation is necessary.
|
||||
# Compile if the inline template or file has not been compiled yet.
|
||||
# Or if local_assigns has a new key, which isn't supported by the compiled code yet.
|
||||
# Or if the file has changed on disk and checking file mods hasn't been disabled.
|
||||
# Method to check whether template compilation is necessary.
|
||||
# The template will be compiled if the inline template or file has not been compiled yet,
|
||||
# if local_assigns has a new key, which isn't supported by the compiled code yet,
|
||||
# or if the file has changed on disk and checking file mods hasn't been disabled.
|
||||
def compile_template?(template, file_name, local_assigns)
|
||||
method_key = file_name || template
|
||||
render_symbol = @@method_names[method_key]
|
||||
|
@ -445,14 +449,15 @@ module ActionView #:nodoc:
|
|||
end
|
||||
end
|
||||
|
||||
# Create source code for given template
|
||||
# Method to create the source code for a given template.
|
||||
def create_template_source(extension, template, render_symbol, locals)
|
||||
if template_requires_setup?(extension)
|
||||
body = case extension.to_sym
|
||||
when :rxml
|
||||
"controller.response.content_type ||= 'application/xml'\n" +
|
||||
"xml = Builder::XmlMarkup.new(:indent => 2)\n" +
|
||||
template
|
||||
"xml ||= Builder::XmlMarkup.new(:indent => 2)\n" +
|
||||
template +
|
||||
"\nxml.target!\n"
|
||||
when :rjs
|
||||
"controller.response.content_type ||= 'text/javascript'\n" +
|
||||
"update_page do |page|\n#{template}\nend"
|
||||
|
@ -473,11 +478,11 @@ module ActionView #:nodoc:
|
|||
"def #{render_symbol}(local_assigns)\n#{locals_code}#{body}\nend"
|
||||
end
|
||||
|
||||
def template_requires_setup?(extension)
|
||||
def template_requires_setup?(extension) #:nodoc:
|
||||
templates_requiring_setup.include? extension.to_s
|
||||
end
|
||||
|
||||
def templates_requiring_setup
|
||||
def templates_requiring_setup #:nodoc:
|
||||
%w(rxml rjs)
|
||||
end
|
||||
|
||||
|
@ -501,6 +506,7 @@ module ActionView #:nodoc:
|
|||
end
|
||||
end
|
||||
|
||||
# Compile and evaluate the template's code
|
||||
def compile_template(extension, template, file_name, local_assigns)
|
||||
render_symbol = assign_method_name(extension, template, file_name)
|
||||
render_source = create_template_source(extension, template, render_symbol, local_assigns.keys)
|
||||
|
|
|
@ -3,14 +3,14 @@ module ActionView
|
|||
|
||||
# CompiledTemplates modules hold methods that have been compiled.
|
||||
# Templates are compiled into these methods so that they do not need to be
|
||||
# re-read and re-parsed each request.
|
||||
# read and parsed for each request.
|
||||
#
|
||||
# Each template may be compiled into one or more methods. Each method accepts a given
|
||||
# set of parameters which is used to implement local assigns passing.
|
||||
#
|
||||
# To use a compiled template module, create a new instance and include it into the class
|
||||
# in which you want the template to be rendered.
|
||||
class CompiledTemplates < Module #:nodoc:
|
||||
class CompiledTemplates < Module
|
||||
attr_reader :method_names
|
||||
|
||||
def initialize
|
||||
|
|
|
@ -13,17 +13,18 @@ module ActionView
|
|||
# is a great of making the record quickly available for editing, but likely to prove lackluster for a complicated real-world form.
|
||||
# In that case, it's better to use the input method and the specialized form methods in link:classes/ActionView/Helpers/FormHelper.html
|
||||
module ActiveRecordHelper
|
||||
# Returns a default input tag for the type of object returned by the method. Example
|
||||
# (title is a VARCHAR column and holds "Hello World"):
|
||||
# Returns a default input tag for the type of object returned by the method. For example, let's say you have a model
|
||||
# that has an attribute +title+ of type VARCHAR column, and this instance holds "Hello World":
|
||||
# input("post", "title") =>
|
||||
# <input id="post_title" name="post[title]" size="30" type="text" value="Hello World" />
|
||||
def input(record_name, method, options = {})
|
||||
InstanceTag.new(record_name, method, self).to_tag(options)
|
||||
end
|
||||
|
||||
# Returns an entire form with input tags and everything for a specified Active Record object. Example
|
||||
# (post is a new record that has a title using VARCHAR and a body using TEXT):
|
||||
# form("post") =>
|
||||
# Returns an entire form with all needed input tags for a specified Active Record object. For example, let's say you
|
||||
# have a table model <tt>Post</tt> with attributes named <tt>title</tt> of type <tt>VARCHAR</tt> and <tt>body</tt> of type <tt>TEXT</tt>:
|
||||
# form("post")
|
||||
# That line would yield a form like the following:
|
||||
# <form action='/post/create' method='post'>
|
||||
# <p>
|
||||
# <label for="post_title">Title</label><br />
|
||||
|
@ -32,14 +33,13 @@ module ActionView
|
|||
# <p>
|
||||
# <label for="post_body">Body</label><br />
|
||||
# <textarea cols="40" id="post_body" name="post[body]" rows="20">
|
||||
# Back to the hill and over it again!
|
||||
# </textarea>
|
||||
# </p>
|
||||
# <input type='submit' value='Create' />
|
||||
# </form>
|
||||
#
|
||||
# It's possible to specialize the form builder by using a different action name and by supplying another
|
||||
# block renderer. Example (entry is a new record that has a message attribute using VARCHAR):
|
||||
# block renderer. For example, let's say you have a model <tt>Entry</tt> with an attribute <tt>message</tt> of type <tt>VARCHAR</tt>:
|
||||
#
|
||||
# form("entry", :action => "sign", :input_block =>
|
||||
# Proc.new { |record, column| "#{column.human_name}: #{input(record, column.name)}<br />" }) =>
|
||||
|
@ -74,16 +74,16 @@ module ActionView
|
|||
content_tag('form', contents, :action => action, :method => 'post', :enctype => options[:multipart] ? 'multipart/form-data': nil)
|
||||
end
|
||||
|
||||
# Returns a string containing the error message attached to the +method+ on the +object+, if one exists.
|
||||
# This error message is wrapped in a DIV tag, which can be specialized to include both a +prepend_text+ and +append_text+
|
||||
# to properly introduce the error and a +css_class+ to style it accordingly. Examples (post has an error message
|
||||
# "can't be empty" on the title attribute):
|
||||
# Returns a string containing the error message attached to the +method+ on the +object+ if one exists.
|
||||
# This error message is wrapped in a <tt>DIV</tt> tag, which can be extended to include a +prepend_text+ and/or +append_text+
|
||||
# (to properly explain the error), and a +css_class+ to style it accordingly. As an example, let's say you have a model
|
||||
# +post+ that has an error message on the +title+ attribute:
|
||||
#
|
||||
# <%= error_message_on "post", "title" %> =>
|
||||
# <div class="formError">can't be empty</div>
|
||||
#
|
||||
# <%= error_message_on "post", "title", "Title simply ", " (or it won't work)", "inputError" %> =>
|
||||
# <div class="inputError">Title simply can't be empty (or it won't work)</div>
|
||||
# <%= error_message_on "post", "title", "Title simply ", " (or it won't work).", "inputError" %> =>
|
||||
# <div class="inputError">Title simply can't be empty (or it won't work).</div>
|
||||
def error_message_on(object, method, prepend_text = "", append_text = "", css_class = "formError")
|
||||
if (obj = instance_variable_get("@#{object}")) && (errors = obj.errors.on(method))
|
||||
content_tag("div", "#{prepend_text}#{errors.is_a?(Array) ? errors.first : errors}#{append_text}", :class => css_class)
|
||||
|
@ -92,11 +92,11 @@ module ActionView
|
|||
end
|
||||
end
|
||||
|
||||
# Returns a string with a div containing all of the error messages for the objects located as instance variables by the names
|
||||
# Returns a string with a <tt>DIV</tt> containing all of the error messages for the objects located as instance variables by the names
|
||||
# given. If more than one object is specified, the errors for the objects are displayed in the order that the object names are
|
||||
# provided.
|
||||
#
|
||||
# This div can be tailored by the following options:
|
||||
# This <tt>DIV</tt> can be tailored by the following options:
|
||||
#
|
||||
# * <tt>header_tag</tt> - Used for the header of the error div (default: h2)
|
||||
# * <tt>id</tt> - The id of the error div (default: errorExplanation)
|
||||
|
@ -105,12 +105,12 @@ module ActionView
|
|||
# any text that you prefer. If <tt>object_name</tt> is not set, the name of
|
||||
# the first object will be used.
|
||||
#
|
||||
# Specifying one object:
|
||||
# To specify the display for one object, you simply provide its name as a parameter. For example, for the +User+ model:
|
||||
#
|
||||
# error_messages_for 'user'
|
||||
#
|
||||
# Specifying more than one object (and using the name 'user' in the
|
||||
# header as the <tt>object_name</tt> instead of 'user_common'):
|
||||
# To specify more than one object, you simply list them; optionally, you can add an extra +object_name+ parameter, which
|
||||
# be the name in the header.
|
||||
#
|
||||
# error_messages_for 'user_common', 'user', :object_name => 'user'
|
||||
#
|
||||
|
|
|
@ -3,6 +3,16 @@ module ActionView
|
|||
# Provides a set of methods for making it easier to locate problems.
|
||||
module DebugHelper
|
||||
# Returns a <pre>-tag set with the +object+ dumped by YAML. Very readable way to inspect an object.
|
||||
# my_hash = {'first' => 1, 'second' => 'two', 'third' => [1,2,3]}
|
||||
# debug(my_hash)
|
||||
# => <pre class='debug_dump'>---
|
||||
# first: 1
|
||||
# second: two
|
||||
# third:
|
||||
# - 1
|
||||
# - 2
|
||||
# - 3
|
||||
# </pre>
|
||||
def debug(object)
|
||||
begin
|
||||
Marshal::dump(object)
|
||||
|
|
|
@ -2,6 +2,9 @@ module ActionView
|
|||
module Helpers
|
||||
module PrototypeHelper
|
||||
|
||||
# Method to execute an element update using Prototype.
|
||||
# DEPRECATION WARNING: This helper has been depercated; use RJS instead.
|
||||
# See ActionView::Helpers::PrototypeHelper::JavaScriptGenerator::GeneratorMethods for more information.
|
||||
def update_element_function(element_id, options = {}, &block)
|
||||
content = escape_javascript(options[:content] || '')
|
||||
content = escape_javascript(capture(&block)) if block
|
||||
|
|
|
@ -250,8 +250,10 @@ module ActionView
|
|||
return function
|
||||
end
|
||||
|
||||
# Observes the field with the DOM ID specified by +field_id+ and makes
|
||||
# an Ajax call when its contents have changed.
|
||||
# Observes the field with the DOM ID specified by +field_id+ and calls a
|
||||
# callback when its contents have changed. The default callback is an
|
||||
# Ajax call. By default the value of the observed field is sent as a
|
||||
# parameter with the Ajax call.
|
||||
#
|
||||
# Required +options+ are either of:
|
||||
# <tt>:url</tt>:: +url_for+-style options for the action to call
|
||||
|
@ -268,14 +270,24 @@ module ActionView
|
|||
# <tt>:update</tt>:: Specifies the DOM ID of the element whose
|
||||
# innerHTML should be updated with the
|
||||
# XMLHttpRequest response text.
|
||||
# <tt>:with</tt>:: A JavaScript expression specifying the
|
||||
# parameters for the XMLHttpRequest. This defaults
|
||||
# to 'value', which in the evaluated context
|
||||
# refers to the new field value. If you specify a
|
||||
# string without a "=", it'll be extended to mean
|
||||
# the form key that the value should be assigned to.
|
||||
# So :with => "term" gives "'term'=value". If a "=" is
|
||||
# present, no extension will happen.
|
||||
# <tt>:with</tt>:: A JavaScript expression specifying the parameters
|
||||
# for the XMLHttpRequest. The default is to send the
|
||||
# key and value of the observed field. Any custom
|
||||
# expressions should return a valid URL query string.
|
||||
# The value of the field is stored in the JavaScript
|
||||
# variable +value+.
|
||||
#
|
||||
# Examples
|
||||
#
|
||||
# :with => "'my_custom_key=' + value"
|
||||
# :with => "'person[name]=' + prompt('New name')"
|
||||
# :with => "Form.Element.serialize('other-field')"
|
||||
#
|
||||
# Finally
|
||||
# :with => 'name'
|
||||
# is shorthand for
|
||||
# :with => "'name=' + value"
|
||||
# This essentially just changes the key of the parameter.
|
||||
# <tt>:on</tt>:: Specifies which event handler to observe. By default,
|
||||
# it's set to "changed" for text fields and areas and
|
||||
# "click" for radio buttons and checkboxes. With this,
|
||||
|
@ -291,11 +303,15 @@ module ActionView
|
|||
build_observer('Form.Element.EventObserver', field_id, options)
|
||||
end
|
||||
end
|
||||
|
||||
# Like +observe_field+, but operates on an entire form identified by the
|
||||
# DOM ID +form_id+. +options+ are the same as +observe_field+, except
|
||||
# the default value of the <tt>:with</tt> option evaluates to the
|
||||
# serialized (request string) value of the form.
|
||||
|
||||
# Observes the form with the DOM ID specified by +form_id+ and calls a
|
||||
# callback when its contents have changed. The default callback is an
|
||||
# Ajax call. By default all fields of the observed field are sent as
|
||||
# parameters with the Ajax call.
|
||||
#
|
||||
# The +options+ for +observe_form+ are the same as the options for
|
||||
# +observe_field+. The JavaScript variable +value+ available to the
|
||||
# <tt>:with</tt> option is set to the serialized form by default.
|
||||
def observe_form(form_id, options = {})
|
||||
if options[:frequency]
|
||||
build_observer('Form.Observer', form_id, options)
|
||||
|
@ -660,10 +676,10 @@ module ActionView
|
|||
end
|
||||
|
||||
def build_observer(klass, name, options = {})
|
||||
if options[:with] && !options[:with].include?("=")
|
||||
if options[:with] && (options[:with] !~ /[=(.]/)
|
||||
options[:with] = "'#{options[:with]}=' + value"
|
||||
else
|
||||
options[:with] ||= 'value' if options[:update]
|
||||
options[:with] ||= 'value' unless options[:function]
|
||||
end
|
||||
|
||||
callback = options[:function] || remote_function(options)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue