Skip to content
Browse files

documentation project patches, closes #7342, #7319, #7316, #7190 [jer…

…emymcanally]

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@6470 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent 4b78a2a commit 2a305949d756c054cee349c1ef3b39c6cf1496f8 @technoweenie technoweenie committed Mar 27, 2007
View
4 actionpack/CHANGELOG
@@ -1,5 +1,9 @@
*SVN*
+* Cleaned up, corrected, and mildly expanded ActionPack documentation. Closes #7190 [jeremymcanally]
+
+* Small collection of ActionController documentation cleanups. Closes #7319 [jeremymcanally]
+
* Make sure the route expiry hash is constructed by comparing the to_param-ized values of each hash. [Jamis Buck]
* Allow configuration of the default action cache path for #caches_action calls. [Rick Olson]
View
4 actionpack/lib/action_controller/assertions/dom_assertions.rb
@@ -1,7 +1,7 @@
module ActionController
module Assertions
module DomAssertions
- # test 2 html strings to be equivalent, i.e. identical up to reordering of attributes
+ # Test two HTML strings for equivalency (e.g., identical up to reordering of attributes)
def assert_dom_equal(expected, actual, message="")
clean_backtrace do
expected_dom = HTML::Document.new(expected).root
@@ -11,7 +11,7 @@ def assert_dom_equal(expected, actual, message="")
end
end
- # negated form of +assert_dom_equivalent+
+ # The negated form of +assert_dom_equivalent+.
def assert_dom_not_equal(expected, actual, message="")
clean_backtrace do
expected_dom = HTML::Document.new(expected).root
View
2 actionpack/lib/action_controller/assertions/model_assertions.rb
@@ -1,7 +1,7 @@
module ActionController
module Assertions
module ModelAssertions
- # ensures that the passed record is valid by active record standards. returns the error messages if not
+ # Ensures that the passed record is valid by ActiveRecord standards and returns any error messages if it is not.
def assert_valid(record)
clean_backtrace do
assert record.valid?, record.errors.full_messages.join("\n")
View
2 actionpack/lib/action_controller/assertions/response_assertions.rb
@@ -119,6 +119,7 @@ def assert_template(expected = nil, message=nil)
end
private
+ # Recognizes the route for a given path.
def recognized_request_for(path, request_method = nil)
path = "/#{path}" unless path.first == '/'
@@ -131,6 +132,7 @@ def recognized_request_for(path, request_method = nil)
request
end
+ # Proxy to to_param if the object will respond to it.
def parameterize(value)
value.respond_to?(:to_param) ? value.to_param : value
end
View
1 actionpack/lib/action_controller/assertions/routing_assertions.rb
@@ -82,6 +82,7 @@ def assert_routing(path, options, defaults={}, extras={}, message=nil)
end
private
+ # Recognizes the route for a given path.
def recognized_request_for(path, request_method = nil)
path = "/#{path}" unless path.first == '/'
View
3 actionpack/lib/action_controller/mime_types.rb
@@ -1,3 +1,6 @@
+# Build list of Mime types for HTTP responses
+# http://www.iana.org/assignments/media-types/
+
Mime::Type.register "*/*", :all
Mime::Type.register "text/plain", :text, [], %w(txt)
Mime::Type.register "text/html", :html, %w( application/xhtml+xml ), %w( xhtml )
View
2 actionpack/lib/action_controller/url_rewriter.rb
@@ -75,6 +75,7 @@ def to_str
alias_method :to_s, :to_str
private
+ # Given a path and options, returns a rewritten URL string
def rewrite_url(options)
rewritten_url = ""
@@ -94,6 +95,7 @@ def rewrite_url(options)
rewritten_url
end
+ # Given a Hash of options, generates a route
def rewrite_path(options)
options = options.symbolize_keys
options.update(options[:params].symbolize_keys) if options[:params]
View
44 actionpack/lib/action_view/base.rb
@@ -148,7 +148,7 @@ class ActionViewError < StandardError #: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 @@ class Base
attr_internal :cookies, :flash, :headers, :params, :request, :response, :session
# 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
@@ -194,17 +194,17 @@ module CompiledTemplates #: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:
@@ -307,7 +307,6 @@ def render_template(template_extension, template, file_path = nil, local_assigns
# 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.
#
@@ -384,6 +383,7 @@ def full_template_path(template_path, extension)
"#{base_path}/#{file_name}"
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)
@@ -402,7 +402,8 @@ def cached_template_extension(template_path)
def find_base_path_for(template_file_name)
@view_paths.find { |p| File.file?(File.join(p, template_file_name)) }
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
@@ -419,6 +420,7 @@ def read_template_file(template_path, extension)
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
@@ -430,6 +432,7 @@ def delegate_render(handler, template, local_assigns)
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
@@ -441,10 +444,10 @@ def supports_local_assigns?(render_symbol, local_assigns)
((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]
@@ -458,14 +461,14 @@ def compile_template?(template, file_name, local_assigns)
end
end
- # handles checking if template changed since last compile, isolated so that templates
- # not stored on the file system can hook and extend appropriately
+ # Method to handle checking a whether a template has changed since last compile; isolated so that templates
+ # not stored on the file system can hook and extend appropriately.
def template_changed_since?(file_name, compile_time)
compile_time < File.mtime(file_name) ||
(File.symlink?(file_name) && (compile_time < File.lstat(file_name).mtime))
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
@@ -493,11 +496,11 @@ def create_template_source(extension, template, render_symbol, locals)
"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(builder rxml rjs)
end
@@ -521,6 +524,7 @@ def compiled_method_name_file_path_segment(file_name)
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)
View
4 actionpack/lib/action_view/compiled_templates.rb
@@ -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
View
36 actionpack/lib/action_view/helpers/active_record_helper.rb
@@ -13,17 +13,18 @@ module Helpers
# 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 @@ def input(record_name, method, options = {})
# <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 @@ def form(record_name, options = {})
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 @@ def error_message_on(object, method, prepend_text = "", append_text = "", css_cl
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 @@ def error_message_on(object, method, prepend_text = "", append_text = "", css_cl
# 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'
#
View
10 actionpack/lib/action_view/helpers/debug_helper.rb
@@ -3,6 +3,16 @@ module Helpers
# 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)
View
2 activerecord/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Small additions and fixes for ActiveRecord documentation. Closes #7342 [jeremymcanally]
+
* Add helpful debugging info to the ActiveRecord::StatementInvalid exception in ActiveRecord::ConnectionAdapters::SqliteAdapter#table_structure. Closes #7925. [court3nay]
* SQLite: binary escaping works with $KCODE='u'. #7862 [tsuka]
View
9 activerecord/lib/active_record/acts/list.rb
@@ -74,6 +74,7 @@ def position_column
# lower in the list of all chapters. Likewise, <tt>chapter.first?</tt> would return true if that chapter is
# the first in the list of all chapters.
module InstanceMethods
+ # Insert the item at the given position (defaults to the top position of 1).
def insert_at(position = 1)
insert_at_position(position)
end
@@ -118,6 +119,7 @@ def move_to_top
end
end
+ # Removes the item from the list.
def remove_from_list
decrement_positions_on_lower_items if in_list?
end
@@ -162,6 +164,7 @@ def lower_item
)
end
+ # Test if this record is in a list
def in_list?
!send(position_column).nil?
end
@@ -178,21 +181,26 @@ def add_to_list_bottom
# Overwrite this method to define the scope of the list changes
def scope_condition() "1" end
+ # Returns the bottom position number in the list.
+ # bottom_position_in_list # => 2
def bottom_position_in_list(except = nil)
item = bottom_item(except)
item ? item.send(position_column) : 0
end
+ # Returns the bottom item
def bottom_item(except = nil)
conditions = scope_condition
conditions = "#{conditions} AND #{self.class.primary_key} != #{except.id}" if except
acts_as_list_class.find(:first, :conditions => conditions, :order => "#{position_column} DESC")
end
+ # Forces item to assume the bottom position in the list.
def assume_bottom_position
update_attribute(position_column, bottom_position_in_list(self).to_i + 1)
end
+ # Forces item to assume the top position in the list.
def assume_top_position
update_attribute(position_column, 1)
end
@@ -227,6 +235,7 @@ def increment_positions_on_lower_items(position)
)
end
+ # Increments position (<tt>position_column</tt>) of all items in the list.
def increment_positions_on_all_items
acts_as_list_class.update_all(
"#{position_column} = (#{position_column} + 1)", "#{scope_condition}"
View
7 activerecord/lib/active_record/acts/tree.rb
@@ -70,16 +70,23 @@ def ancestors
nodes
end
+ # Returns the root node of the tree.
def root
node = self
node = node.parent while node.parent
node
end
+ # Returns all siblings of the current node.
+ #
+ # subchild1.siblings # => [subchild2]
def siblings
self_and_siblings - [self]
end
+ # Returns all siblings and a reference to the current node.
+ #
+ # subchild1.self_and_siblings # => [subchild1, subchild2]
def self_and_siblings
parent ? parent.children : self.class.roots
end
View
9 activerecord/lib/active_record/associations.rb
@@ -798,6 +798,7 @@ def belongs_to(association_id, options = {})
deprecated_association_comparison_method(reflection.name, reflection.class_name)
end
+ # Create the callbacks to update counter cache
if options[:counter_cache]
cache_column = options[:counter_cache] == true ?
"#{self.to_s.underscore.pluralize}_count" :
@@ -935,6 +936,12 @@ def destroy_without_callbacks
end
private
+ # Generate a join table name from two provided tables names.
+ # The order of names in join name is determined by lexical precedence.
+ # join_table_name("members", "clubs")
+ # => "clubs_members"
+ # join_table_name("members", "special_clubs")
+ # => "members_special_clubs"
def join_table_name(first_table_name, second_table_name)
if first_table_name < second_table_name
join_table = "#{first_table_name}_#{second_table_name}"
@@ -944,7 +951,7 @@ def join_table_name(first_table_name, second_table_name)
table_name_prefix + join_table + table_name_suffix
end
-
+
def association_accessor_methods(reflection, association_proxy_class)
define_method(reflection.name) do |*params|
force_reload = params.first unless params.empty?
View
3 activerecord/lib/active_record/base.rb
@@ -1229,6 +1229,9 @@ def undecorated_table_name(class_name = base_class.name)
#
# It's even possible to use all the additional parameters to find. For example, the full interface for find_all_by_amount
# is actually find_all_by_amount(amount, options).
+ #
+ # This also enables you to initialize a record if it is not found, such as find_or_initialize_by_amount(amount)
+ # or find_or_create_by_user_and_password(user, password).
def method_missing(method_id, *arguments)
if match = /^find_(all_by|by)_([_a-zA-Z]\w*)$/.match(method_id.to_s)
finder, deprecated_finder = determine_finder(match), determine_deprecated_finder(match)
View
4 activerecord/lib/active_record/calculations.rb
@@ -246,8 +246,8 @@ def validate_calculation_options(operation, options = {})
options.assert_valid_keys(CALCULATIONS_OPTIONS)
end
- # converts a given key to the value that the database adapter returns as
- #
+ # Converts a given key to the value that the database adapter returns as
+ # as a usable column name.
# users.id #=> users_id
# sum(id) #=> sum_id
# count(distinct users.id) #=> count_distinct_users_id
View
6 activerecord/lib/active_record/deprecated_finders.rb
@@ -1,7 +1,7 @@
module ActiveRecord
class Base
class << self
- # This method is deprecated in favor of find with the :conditions option.
+ # DEPRECATION NOTICE: This method is deprecated in favor of find with the :conditions option.
#
# Works like find, but the record matching +id+ must also meet the +conditions+.
# +RecordNotFound+ is raised if no record can be found matching the +id+ or meeting the condition.
@@ -12,7 +12,7 @@ def find_on_conditions(ids, conditions) # :nodoc:
end
deprecate :find_on_conditions => "use find(ids, :conditions => conditions)"
- # This method is deprecated in favor of find(:first, options).
+ # DEPRECATION NOTICE: This method is deprecated in favor of find(:first, options).
#
# Returns the object for the first record responding to the conditions in +conditions+,
# such as "group = 'master'". If more than one record is returned from the query, it's the first that'll
@@ -24,7 +24,7 @@ def find_first(conditions = nil, orderings = nil, joins = nil) # :nodoc:
end
deprecate :find_first => "use find(:first, ...)"
- # This method is deprecated in favor of find(:all, options).
+ # DEPRECATION NOTICE: This method is deprecated in favor of find(:all, options).
#
# Returns an array of all the objects that could be instantiated from the associated
# table in the database. The +conditions+ can be used to narrow the selection of objects (WHERE-part),
View
2 railties/CHANGELOG
@@ -1,5 +1,7 @@
*SVN*
+* Give generate scaffold a more descriptive database message. Closes #7316 [jeremymcanally]
+
* Canonicalize RAILS_ROOT by using File.expand_path on Windows, which doesn't have to worry about symlinks, and Pathname#realpath elsewhere, which respects symlinks in relative paths but is incompatible with Windows. #6755 [Jeremy Kemper, trevor]
* Deprecation: remove components from controller paths. [Jeremy Kemper]
View
2 railties/lib/initializer.rb
@@ -205,7 +205,9 @@ def load_environment
silence_warnings do
config = configuration
constants = self.class.constants
+
eval(IO.read(configuration.environment_path), binding, configuration.environment_path)
+
(self.class.constants - constants).each do |const|
Object.const_set(const, self.class.const_get(const))
end
View
2 railties/lib/rails_generator/generators/components/scaffold/scaffold_generator.rb
@@ -173,7 +173,7 @@ def create_sandbox
sandbox.model_instance = model_instance
sandbox.instance_variable_set("@#{singular_name}", sandbox.model_instance)
rescue ActiveRecord::StatementInvalid => e
- logger.error "Before updating scaffolding from new DB schema, try creating a table for your model (#{class_name})"
+ logger.error "Before updating scaffolding from new DB schema, try creating a table for your model (#{class_name}) named #{class_name.tableize}."
raise SystemExit
end
sandbox.suffix = suffix

0 comments on commit 2a30594

Please sign in to comment.
Something went wrong with that request. Please try again.