mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge branch 'master' of git://github.com/lifo/docrails
Conflicts: actionmailer/lib/action_mailer/base.rb activesupport/lib/active_support/core_ext/kernel/requires.rb
This commit is contained in:
commit
00e1d0832e
94 changed files with 406 additions and 361 deletions
46
README.rdoc
46
README.rdoc
|
@ -1,30 +1,35 @@
|
|||
== Welcome to Rails
|
||||
|
||||
Rails is a web-application framework that includes everything needed to create
|
||||
database-backed web applications according to the Model-View-Control pattern.
|
||||
database-backed web applications according to the Model-View-Controller pattern.
|
||||
|
||||
This pattern splits the view (also called the presentation) into "dumb"
|
||||
templates that are primarily responsible for inserting pre-built data in between
|
||||
HTML tags. The model contains the "smart" domain objects (such as Account,
|
||||
Product, Person, Post) that holds all the business logic and knows how to
|
||||
persist themselves to a database. The controller handles the incoming requests
|
||||
(such as Save New Account, Update Product, Show Post) by manipulating the model
|
||||
and directing data to the view.
|
||||
Understanding the MVC pattern is key to understanding Rails. MVC divides your application
|
||||
into three layers, each with a specific responsibility.
|
||||
|
||||
In Rails, the model is handled by what's called an object-relational mapping
|
||||
layer entitled Active Record. This layer allows you to present the data from
|
||||
database rows as objects and embellish these data objects with business logic
|
||||
methods. You can read more about Active Record in its
|
||||
The View layer is composed of "templates" that are responsible for providing
|
||||
appropriate representations of your application's resources. Templates
|
||||
can come in a variety of formats, but most view templates are HTML with embedded Ruby
|
||||
code (.erb files).
|
||||
|
||||
The Model layer represents your domain model (such as Account, Product, Person, Post)
|
||||
and encapsulates the business logic that is specific to your application. In Rails,
|
||||
database-backed model classes are derived from ActiveRecord::Base. ActiveRecord allows
|
||||
you to present the data from database rows as objects and embellish these data objects
|
||||
with business logic methods. Although most Rails models are backed by a database, models
|
||||
can also be ordinary Ruby classes, or Ruby classes that implement a set of interfaces as
|
||||
provided by the ActiveModel module. You can read more about Active Record in its
|
||||
{README}[link:files/activerecord/README_rdoc.html].
|
||||
|
||||
The controller and view are handled by the Action Pack, which handles both
|
||||
layers by its two parts: Action View and Action Controller. These two layers
|
||||
are bundled in a single package due to their heavy interdependence. This is
|
||||
unlike the relationship between the Active Record and Action Pack that is much
|
||||
more separate. Each of these packages can be used independently outside of
|
||||
Rails. You can read more about Action Pack in its
|
||||
{README}[link:files/actionpack/README_rdoc.html].
|
||||
The Controller layer is responsible for handling incoming HTTP requests and providing a
|
||||
suitable response. Usually this means returning HTML, but Rails controllers can also
|
||||
generate XML, JSON, PDFs, mobile-specific views, and more. Controllers manipulate models
|
||||
and render view templates in order to generate the appropriate HTTP response.
|
||||
|
||||
In Rails, the Controller and View layers are handled together by Action Pack.
|
||||
These two layers are bundled in a single package due to their heavy interdependence.
|
||||
This is unlike the relationship between the Active Record and Action Pack which are
|
||||
independent. Each of these packages can be used independently outside of Rails. You
|
||||
can read more about Action Pack in its {README}[link:files/actionpack/README_rdoc.html].
|
||||
|
||||
== Getting Started
|
||||
|
||||
|
@ -60,9 +65,10 @@ Rails. You can read more about Action Pack in its
|
|||
== Contributing
|
||||
|
||||
We encourage you to contribute to Ruby on Rails! Please check out the {Contributing to Rails
|
||||
guide}[http://edgeguides.rubyonrails.org/contributing_to_rails.html] for guidelines about how
|
||||
guide}[http://edgeguides.rubyonrails.org/contributing_to_ruby_on_rails.html] for guidelines about how
|
||||
to proceed. {Join us}[http://contributors.rubyonrails.org]!
|
||||
|
||||
== License
|
||||
|
||||
Ruby on Rails is released under the MIT license.
|
||||
|
||||
|
|
|
@ -153,7 +153,7 @@ Action Mailer is released under the MIT license.
|
|||
|
||||
API documentation is at
|
||||
|
||||
* http://api.rubyonrails.com
|
||||
* http://api.rubyonrails.org
|
||||
|
||||
Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
|
||||
|
||||
|
|
|
@ -212,7 +212,7 @@ module ActionMailer #:nodoc:
|
|||
#
|
||||
# = Observing and Intercepting Mails
|
||||
#
|
||||
# Action Mailer provides hooks into the Mail observer and interceptor methods. These allow you to
|
||||
# Action Mailer provides hooks into the Mail observer and interceptor methods. These allow you to
|
||||
# register objects that are called during the mail delivery life cycle.
|
||||
#
|
||||
# An observer object must implement the <tt>:delivered_email(message)</tt> method which will be
|
||||
|
@ -220,7 +220,7 @@ module ActionMailer #:nodoc:
|
|||
#
|
||||
# An interceptor object must implement the <tt>:delivering_email(message)</tt> method which will be
|
||||
# called before the email is sent, allowing you to make modifications to the email before it hits
|
||||
# the delivery agents. Your object should make any needed modifications directly to the passed
|
||||
# the delivery agents. Your object should make any needed modifications directly to the passed
|
||||
# in Mail::Message instance.
|
||||
#
|
||||
# = Default Hash
|
||||
|
@ -311,11 +311,11 @@ module ActionMailer #:nodoc:
|
|||
#
|
||||
# * <tt>delivery_method</tt> - Defines a delivery method. Possible values are <tt>:smtp</tt> (default),
|
||||
# <tt>:sendmail</tt>, <tt>:test</tt>, and <tt>:file</tt>. Or you may provide a custom delivery method
|
||||
# object eg. MyOwnDeliveryMethodClass.new. See the Mail gem documentation on the interface you need to
|
||||
# object eg. MyOwnDeliveryMethodClass.new. See the Mail gem documentation on the interface you need to
|
||||
# implement for a custom delivery agent.
|
||||
#
|
||||
# * <tt>perform_deliveries</tt> - Determines whether emails are actually sent from Action Mailer when you
|
||||
# call <tt>.deliver</tt> on an mail message or on an Action Mailer method. This is on by default but can
|
||||
# call <tt>.deliver</tt> on an mail message or on an Action Mailer method. This is on by default but can
|
||||
# be turned off to aid in functional testing.
|
||||
#
|
||||
# * <tt>deliveries</tt> - Keeps an array of all the emails sent out through the Action Mailer with
|
||||
|
@ -549,8 +549,8 @@ module ActionMailer #:nodoc:
|
|||
# method.
|
||||
#
|
||||
# When a <tt>:return_path</tt> is specified as header, that value will be used as the 'envelope from'
|
||||
# address for the Mail message. Setting this is useful when you want delivery notifications
|
||||
# sent to a different address than the one in <tt>:from</tt>. Mail will actually use the
|
||||
# address for the Mail message. Setting this is useful when you want delivery notifications
|
||||
# sent to a different address than the one in <tt>:from</tt>. Mail will actually use the
|
||||
# <tt>:return_path</tt> in preference to the <tt>:sender</tt> in preference to the <tt>:from</tt>
|
||||
# field for the 'envelope from' value.
|
||||
#
|
||||
|
|
|
@ -334,7 +334,7 @@ Action Pack is released under the MIT license.
|
|||
|
||||
API documentation is at
|
||||
|
||||
* http://api.rubyonrails.com
|
||||
* http://api.rubyonrails.org
|
||||
|
||||
Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ module AbstractController
|
|||
# <tt>AbstractController::Base</tt> is a low-level API. Nobody should be
|
||||
# using it directly, and subclasses (like ActionController::Base) are
|
||||
# expected to provide their own +render+ method, since rendering means
|
||||
# different things depending on the context.
|
||||
# different things depending on the context.
|
||||
class Base
|
||||
attr_internal :response_body
|
||||
attr_internal :action_name
|
||||
|
|
|
@ -67,7 +67,7 @@ module AbstractController
|
|||
# helper FooHelper # => includes FooHelper
|
||||
#
|
||||
# When the argument is a string or symbol, the method will provide the "_helper" suffix, require the file
|
||||
# and include the module in the template class. The second form illustrates how to include custom helpers
|
||||
# and include the module in the template class. The second form illustrates how to include custom helpers
|
||||
# when working with namespaced controllers, or other cases where the file containing the helper definition is not
|
||||
# in one of Rails' standard load paths:
|
||||
# helper :foo # => requires 'foo_helper' and includes FooHelper
|
||||
|
|
|
@ -39,8 +39,8 @@ module ActionController #:nodoc:
|
|||
# <tt>:action => 'list', :format => :xml</tt>.
|
||||
#
|
||||
# You can set modify the default action cache path by passing a
|
||||
# <tt>:cache_path</tt> option. This will be passed directly to
|
||||
# <tt>ActionCachePath.path_for</tt>. This is handy for actions with
|
||||
# <tt>:cache_path</tt> option. This will be passed directly to
|
||||
# <tt>ActionCachePath.path_for</tt>. This is handy for actions with
|
||||
# multiple possible routes that should be cached differently. If a
|
||||
# block is given, it is called with the current controller instance.
|
||||
#
|
||||
|
|
|
@ -37,7 +37,7 @@ module ActionController #:nodoc:
|
|||
#
|
||||
# The default Content-Type and Content-Disposition headers are
|
||||
# set to download arbitrary binary files in as many browsers as
|
||||
# possible. IE versions 4, 5, 5.5, and 6 are all known to have
|
||||
# possible. IE versions 4, 5, 5.5, and 6 are all known to have
|
||||
# a variety of quirks (especially when downloading over SSL).
|
||||
#
|
||||
# Simple download:
|
||||
|
@ -58,8 +58,8 @@ module ActionController #:nodoc:
|
|||
#
|
||||
# Also be aware that the document may be cached by proxies and browsers.
|
||||
# The Pragma and Cache-Control headers declare how the file may be cached
|
||||
# by intermediaries. They default to require clients to validate with
|
||||
# the server before releasing cached responses. See
|
||||
# by intermediaries. They default to require clients to validate with
|
||||
# the server before releasing cached responses. See
|
||||
# http://www.mnot.net/cache_docs/ for an overview of web caching and
|
||||
# http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
|
||||
# for the Cache-Control header spec.
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
module ActionController
|
||||
# This module provides a method which will redirects browser to use HTTPS
|
||||
# This module provides a method which will redirect browser to use HTTPS
|
||||
# protocol. This will ensure that user's sensitive information will be
|
||||
# transferred safely over the internet. You _should_ always force browser
|
||||
# to use HTTPS when you're transferring sensitive information such as
|
||||
# user authentication, account information, or credit card information.
|
||||
#
|
||||
# Note that if you really concern about your application safety, you might
|
||||
# consider using +config.force_ssl+ in your configuration config file instead.
|
||||
# Note that if you are really concerned about your application security,
|
||||
# you might consider using +config.force_ssl+ in your config file instead.
|
||||
# That will ensure all the data transferred via HTTPS protocol and prevent
|
||||
# user from getting session hijacked when accessing the site under unsecured
|
||||
# HTTP protocol.
|
||||
|
|
|
@ -400,7 +400,7 @@ module ActionController
|
|||
# the present token and options.
|
||||
#
|
||||
# controller - ActionController::Base instance for the current request.
|
||||
# login_procedure - Proc to call if a token is present. The Proc should
|
||||
# login_procedure - Proc to call if a token is present. The Proc should
|
||||
# take 2 arguments:
|
||||
# authenticate(controller) { |token, options| ... }
|
||||
#
|
||||
|
@ -413,7 +413,7 @@ module ActionController
|
|||
end
|
||||
end
|
||||
|
||||
# Parses the token and options out of the token authorization header. If
|
||||
# Parses the token and options out of the token authorization header. If
|
||||
# the header looks like this:
|
||||
# Authorization: Token token="abc", nonce="def"
|
||||
# Then the returned token is "abc", and the options is {:nonce => "def"}
|
||||
|
|
|
@ -63,7 +63,7 @@ module ActionController #:nodoc:
|
|||
#
|
||||
# Valid Options:
|
||||
#
|
||||
# * <tt>:only/:except</tt> - Passed to the <tt>before_filter</tt> call. Set which actions are verified.
|
||||
# * <tt>:only/:except</tt> - Passed to the <tt>before_filter</tt> call. Set which actions are verified.
|
||||
def protect_from_forgery(options = {})
|
||||
self.request_forgery_protection_token ||= :authenticity_token
|
||||
prepend_before_filter :verify_authenticity_token, options
|
||||
|
@ -71,7 +71,7 @@ module ActionController #:nodoc:
|
|||
end
|
||||
|
||||
protected
|
||||
# The actual before_filter that is used. Modify this to change how you handle unverified requests.
|
||||
# The actual before_filter that is used. Modify this to change how you handle unverified requests.
|
||||
def verify_authenticity_token
|
||||
unless verified_request?
|
||||
logger.debug "WARNING: Can't verify CSRF token authenticity" if logger
|
||||
|
@ -83,7 +83,7 @@ module ActionController #:nodoc:
|
|||
reset_session
|
||||
end
|
||||
|
||||
# Returns true or false if a request is verified. Checks:
|
||||
# Returns true or false if a request is verified. Checks:
|
||||
#
|
||||
# * is it a GET request? Gets should be safe and idempotent
|
||||
# * Does the form_authenticity_token match the given token value from the params?
|
||||
|
|
|
@ -103,7 +103,7 @@ module HTML
|
|||
# Specifies the default Set of allowed shorthand css properties for the #sanitize and #sanitize_css helpers.
|
||||
self.shorthand_css_properties = Set.new(%w(background border margin padding))
|
||||
|
||||
# Sanitizes a block of css code. Used by #sanitize when it comes across a style attribute
|
||||
# Sanitizes a block of css code. Used by #sanitize when it comes across a style attribute
|
||||
def sanitize_css(style)
|
||||
# disallow urls
|
||||
style = style.to_s.gsub(/url\s*\(\s*[^\s)]+?\s*\)\s*/, ' ')
|
||||
|
|
|
@ -47,7 +47,7 @@ module Mime
|
|||
cattr_reader :html_types
|
||||
|
||||
# These are the content types which browsers can generate without using ajax, flash, etc
|
||||
# i.e. following a link, getting an image or posting a form. CSRF protection
|
||||
# i.e. following a link, getting an image or posting a form. CSRF protection
|
||||
# only needs to protect against these types.
|
||||
@@browser_generated_types = Set.new [:html, :url_encoded_form, :multipart_form, :text]
|
||||
cattr_reader :browser_generated_types
|
||||
|
@ -246,7 +246,7 @@ module Mime
|
|||
end
|
||||
end
|
||||
|
||||
# Returns true if Action Pack should check requests using this Mime Type for possible request forgery. See
|
||||
# Returns true if Action Pack should check requests using this Mime Type for possible request forgery. See
|
||||
# ActionController::RequestForgeryProtection.
|
||||
def verify_request?
|
||||
@@browser_generated_types.include?(to_sym)
|
||||
|
|
|
@ -166,10 +166,10 @@ module ActionDispatch
|
|||
)\.
|
||||
}x
|
||||
|
||||
# Determines originating IP address. REMOTE_ADDR is the standard
|
||||
# but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or
|
||||
# Determines originating IP address. REMOTE_ADDR is the standard
|
||||
# but will fail if the user is behind a proxy. HTTP_CLIENT_IP and/or
|
||||
# HTTP_X_FORWARDED_FOR are set by proxies so check for these if
|
||||
# REMOTE_ADDR is a proxy. HTTP_X_FORWARDED_FOR may be a comma-
|
||||
# REMOTE_ADDR is a proxy. HTTP_X_FORWARDED_FOR may be a comma-
|
||||
# delimited list in the case of multiple chained proxies; the last
|
||||
# address which is not trusted is the originating IP.
|
||||
def remote_ip
|
||||
|
|
|
@ -59,7 +59,7 @@ module ActionDispatch
|
|||
# The option symbols for setting cookies are:
|
||||
#
|
||||
# * <tt>:value</tt> - The cookie's value or list of values (as an array).
|
||||
# * <tt>:path</tt> - The path for which this cookie applies. Defaults to the root
|
||||
# * <tt>:path</tt> - The path for which this cookie applies. Defaults to the root
|
||||
# of the application.
|
||||
# * <tt>:domain</tt> - The domain for which this cookie applies so you can
|
||||
# restrict to the domain level. If you use a schema like www.example.com
|
||||
|
|
|
@ -335,7 +335,7 @@ module ActionDispatch
|
|||
#
|
||||
# [:on]
|
||||
# Shorthand for wrapping routes in a specific RESTful context. Valid
|
||||
# values are +:member+, +:collection+, and +:new+. Only use within
|
||||
# values are +:member+, +:collection+, and +:new+. Only use within
|
||||
# <tt>resource(s)</tt> block. For example:
|
||||
#
|
||||
# resource :bar do
|
||||
|
@ -578,8 +578,8 @@ module ActionDispatch
|
|||
# end
|
||||
#
|
||||
# This generates helpers such as +account_projects_path+, just like +resources+ does.
|
||||
# The difference here being that the routes generated are like /rails/projects/2,
|
||||
# rather than /accounts/rails/projects/2.
|
||||
# The difference here being that the routes generated are like /:account_id/projects,
|
||||
# rather than /accounts/:account_id/projects.
|
||||
#
|
||||
# === Options
|
||||
#
|
||||
|
@ -1094,11 +1094,11 @@ module ActionDispatch
|
|||
# [:shallow_path]
|
||||
# Prefixes nested shallow routes with the specified path.
|
||||
#
|
||||
# scope :shallow_path => "sekret" do
|
||||
# resources :posts do
|
||||
# resources :comments, :shallow => true
|
||||
# scope :shallow_path => "sekret" do
|
||||
# resources :posts do
|
||||
# resources :comments, :shallow => true
|
||||
# end
|
||||
# end
|
||||
# end
|
||||
#
|
||||
# The +comments+ resource here will have the following routes generated for it:
|
||||
#
|
||||
|
|
|
@ -108,7 +108,7 @@ module ActionDispatch
|
|||
end
|
||||
|
||||
# Generate a url based on the options provided, default_url_options and the
|
||||
# routes defined in routes.rb. The following options are supported:
|
||||
# routes defined in routes.rb. The following options are supported:
|
||||
#
|
||||
# * <tt>:only_path</tt> - If true, the relative url is returned. Defaults to +false+.
|
||||
# * <tt>:protocol</tt> - The protocol to connect to. Defaults to 'http'.
|
||||
|
|
|
@ -7,18 +7,18 @@ module ActionDispatch
|
|||
# Suite of assertions to test routes generated by \Rails and the handling of requests made to them.
|
||||
module RoutingAssertions
|
||||
# Asserts that the routing of the given +path+ was handled correctly and that the parsed options (given in the +expected_options+ hash)
|
||||
# match +path+. Basically, it asserts that \Rails recognizes the route given by +expected_options+.
|
||||
# match +path+. Basically, it asserts that \Rails recognizes the route given by +expected_options+.
|
||||
#
|
||||
# Pass a hash in the second argument (+path+) to specify the request method. This is useful for routes
|
||||
# requiring a specific HTTP method. The hash should contain a :path with the incoming request path
|
||||
# Pass a hash in the second argument (+path+) to specify the request method. This is useful for routes
|
||||
# requiring a specific HTTP method. The hash should contain a :path with the incoming request path
|
||||
# and a :method containing the required HTTP verb.
|
||||
#
|
||||
# # assert that POSTing to /items will call the create action on ItemsController
|
||||
# assert_recognizes({:controller => 'items', :action => 'create'}, {:path => 'items', :method => :post})
|
||||
#
|
||||
# You can also pass in +extras+ with a hash containing URL parameters that would normally be in the query string. This can be used
|
||||
# to assert that values in the query string string will end up in the params hash correctly. To test query strings you must use the
|
||||
# extras argument, appending the query string on the path directly will not work. For example:
|
||||
# You can also pass in +extras+ with a hash containing URL parameters that would normally be in the query string. This can be used
|
||||
# to assert that values in the query string string will end up in the params hash correctly. To test query strings you must use the
|
||||
# extras argument, appending the query string on the path directly will not work. For example:
|
||||
#
|
||||
# # assert that a path of '/items/list/1?view=print' returns the correct options
|
||||
# assert_recognizes({:controller => 'items', :action => 'list', :id => '1', :view => 'print'}, 'items/list/1', { :view => "print" })
|
||||
|
@ -49,7 +49,7 @@ module ActionDispatch
|
|||
assert_equal(expected_options, request.path_parameters, msg)
|
||||
end
|
||||
|
||||
# Asserts that the provided options can be used to generate the provided path. This is the inverse of +assert_recognizes+.
|
||||
# Asserts that the provided options can be used to generate the provided path. This is the inverse of +assert_recognizes+.
|
||||
# The +extras+ parameter is used to tell the request the names and values of additional request parameters that would be in
|
||||
# a query string. The +message+ parameter allows you to specify a custom error message for assertion failures.
|
||||
#
|
||||
|
@ -92,10 +92,10 @@ module ActionDispatch
|
|||
end
|
||||
|
||||
# Asserts that path and options match both ways; in other words, it verifies that <tt>path</tt> generates
|
||||
# <tt>options</tt> and then that <tt>options</tt> generates <tt>path</tt>. This essentially combines +assert_recognizes+
|
||||
# <tt>options</tt> and then that <tt>options</tt> generates <tt>path</tt>. This essentially combines +assert_recognizes+
|
||||
# and +assert_generates+ into one step.
|
||||
#
|
||||
# The +extras+ hash allows you to specify options that would normally be provided as a query string to the action. The
|
||||
# The +extras+ hash allows you to specify options that would normally be provided as a query string to the action. The
|
||||
# +message+ parameter allows you to specify a custom error message to display upon failure.
|
||||
#
|
||||
# ==== Examples
|
||||
|
|
|
@ -62,7 +62,7 @@ module ActionDispatch
|
|||
#
|
||||
# The request_method is +:get+, +:post+, +:put+, +:delete+ or +:head+; the
|
||||
# parameters are +nil+, a hash, or a url-encoded or multipart string;
|
||||
# the headers are a hash. Keys are automatically upcased and prefixed
|
||||
# the headers are a hash. Keys are automatically upcased and prefixed
|
||||
# with 'HTTP_' if not already.
|
||||
def xml_http_request(request_method, path, parameters = nil, headers = nil)
|
||||
headers ||= {}
|
||||
|
|
|
@ -27,7 +27,7 @@ module ActionView
|
|||
# "The current timestamp is #{Time.now}."
|
||||
# end
|
||||
#
|
||||
# You can then use that variable anywhere else. For example:
|
||||
# You can then use that variable anywhere else. For example:
|
||||
#
|
||||
# <html>
|
||||
# <head><title><%= @greeting %></title></head>
|
||||
|
@ -76,7 +76,7 @@ module ActionView
|
|||
#
|
||||
# <%= stored_content %>
|
||||
#
|
||||
# You can use the <tt>yield</tt> syntax alongside an existing call to <tt>yield</tt> in a layout. For example:
|
||||
# You can use the <tt>yield</tt> syntax alongside an existing call to <tt>yield</tt> in a layout. For example:
|
||||
#
|
||||
# <%# This is the layout %>
|
||||
# <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
|
|
|
@ -517,7 +517,7 @@ module ActionView
|
|||
# # that is named 'due' rather than 'day'.
|
||||
# select_day(my_time, :field_name => 'due')
|
||||
#
|
||||
# # Generates a select field for days with a custom prompt. Use <tt>:prompt => true</tt> for a
|
||||
# # Generates a select field for days with a custom prompt. Use <tt>:prompt => true</tt> for a
|
||||
# # generic prompt.
|
||||
# select_day(5, :prompt => 'Choose day')
|
||||
#
|
||||
|
|
|
@ -125,7 +125,7 @@ module ActionView
|
|||
# This allows the user to submit a form page more than once with the expected results of creating multiple records.
|
||||
# In addition, this allows a single partial to be used to generate form inputs for both edit and create forms.
|
||||
#
|
||||
# By default, <tt>post.person_id</tt> is the selected option. Specify <tt>:selected => value</tt> to use a different selection
|
||||
# By default, <tt>post.person_id</tt> is the selected option. Specify <tt>:selected => value</tt> to use a different selection
|
||||
# or <tt>:selected => nil</tt> to leave all options unselected. Similarly, you can specify values to be disabled in the option
|
||||
# tags by specifying the <tt>:disabled</tt> option. This can either be a single value or an array of values to be disabled.
|
||||
def select(object, method, choices, options = {}, html_options = {})
|
||||
|
@ -255,7 +255,7 @@ module ActionView
|
|||
# Accepts a container (hash, array, enumerable, your type) and returns a string of option tags. Given a container
|
||||
# where the elements respond to first and last (such as a two-element array), the "lasts" serve as option values and
|
||||
# the "firsts" as option text. Hashes are turned into this form automatically, so the keys become "firsts" and values
|
||||
# become lasts. If +selected+ is specified, the matching "last" or element will get the selected option-tag. +selected+
|
||||
# become lasts. If +selected+ is specified, the matching "last" or element will get the selected option-tag. +selected+
|
||||
# may also be an array of values to be selected when using a multiple select.
|
||||
#
|
||||
# Examples (call, result):
|
||||
|
@ -406,13 +406,13 @@ module ActionView
|
|||
# wraps them with <tt><optgroup></tt> tags.
|
||||
#
|
||||
# Parameters:
|
||||
# * +grouped_options+ - Accepts a nested array or hash of strings. The first value serves as the
|
||||
# * +grouped_options+ - Accepts a nested array or hash of strings. The first value serves as the
|
||||
# <tt><optgroup></tt> label while the second value must be an array of options. The second value can be a
|
||||
# nested array of text-value pairs. See <tt>options_for_select</tt> for more info.
|
||||
# Ex. ["North America",[["United States","US"],["Canada","CA"]]]
|
||||
# * +selected_key+ - A value equal to the +value+ attribute for one of the <tt><option></tt> tags,
|
||||
# which will have the +selected+ attribute set. Note: It is possible for this value to match multiple options
|
||||
# as you might have the same option in multiple groups. Each will then get <tt>selected="selected"</tt>.
|
||||
# as you might have the same option in multiple groups. Each will then get <tt>selected="selected"</tt>.
|
||||
# * +prompt+ - set to true or a prompt string. When the select element doesn't have a value yet, this
|
||||
# prepends an option with a generic prompt - "Please select" - or the given prompt string.
|
||||
#
|
||||
|
|
|
@ -204,7 +204,7 @@ module ActionView
|
|||
text_field_tag(name, value, options.stringify_keys.update("type" => "hidden"))
|
||||
end
|
||||
|
||||
# Creates a file upload field. If you are using file uploads then you will also need
|
||||
# Creates a file upload field. If you are using file uploads then you will also need
|
||||
# to set the multipart option for the form tag:
|
||||
#
|
||||
# <%= form_tag '/upload', :multipart => true do %>
|
||||
|
|
|
@ -14,13 +14,13 @@ module ActionView
|
|||
#
|
||||
# It also strips href/src tags with invalid protocols, like javascript: especially.
|
||||
# It does its best to counter any tricks that hackers may use, like throwing in
|
||||
# unicode/ascii/hex values to get past the javascript: filters. Check out
|
||||
# unicode/ascii/hex values to get past the javascript: filters. Check out
|
||||
# the extensive test suite.
|
||||
#
|
||||
# <%= sanitize @article.body %>
|
||||
#
|
||||
# You can add or remove tags/attributes if you want to customize it a bit.
|
||||
# See ActionView::Base for full docs on the available options. You can add
|
||||
# See ActionView::Base for full docs on the available options. You can add
|
||||
# tags/attributes for single uses of +sanitize+ by passing either the
|
||||
# <tt>:attributes</tt> or <tt>:tags</tt> options:
|
||||
#
|
||||
|
@ -66,7 +66,7 @@ module ActionView
|
|||
self.class.white_list_sanitizer.sanitize_css(style)
|
||||
end
|
||||
|
||||
# Strips all HTML tags from the +html+, including comments. This uses the
|
||||
# Strips all HTML tags from the +html+, including comments. This uses the
|
||||
# html-scanner tokenizer and so its HTML parsing ability is limited by
|
||||
# that of html-scanner.
|
||||
#
|
||||
|
@ -142,7 +142,7 @@ module ActionView
|
|||
white_list_sanitizer.protocol_separator = value
|
||||
end
|
||||
|
||||
# Gets the HTML::FullSanitizer instance used by +strip_tags+. Replace with
|
||||
# Gets the HTML::FullSanitizer instance used by +strip_tags+. Replace with
|
||||
# any object that responds to +sanitize+.
|
||||
#
|
||||
# class Application < Rails::Application
|
||||
|
@ -153,7 +153,7 @@ module ActionView
|
|||
@full_sanitizer ||= HTML::FullSanitizer.new
|
||||
end
|
||||
|
||||
# Gets the HTML::LinkSanitizer instance used by +strip_links+. Replace with
|
||||
# Gets the HTML::LinkSanitizer instance used by +strip_links+. Replace with
|
||||
# any object that responds to +sanitize+.
|
||||
#
|
||||
# class Application < Rails::Application
|
||||
|
|
|
@ -94,7 +94,7 @@ module ActionView
|
|||
end
|
||||
end
|
||||
|
||||
# Returns a CDATA section with the given +content+. CDATA sections
|
||||
# Returns a CDATA section with the given +content+. CDATA sections
|
||||
# are used to escape blocks of text containing characters which would
|
||||
# otherwise be recognized as markup. CDATA sections begin with the string
|
||||
# <tt><![CDATA[</tt> and end with (and may not contain) the string <tt>]]></tt>.
|
||||
|
|
|
@ -232,7 +232,7 @@ module ActionView
|
|||
# considered as a linebreak and a <tt><br /></tt> tag is appended. This
|
||||
# method does not remove the newlines from the +text+.
|
||||
#
|
||||
# You can pass any HTML attributes into <tt>html_options</tt>. These
|
||||
# You can pass any HTML attributes into <tt>html_options</tt>. These
|
||||
# will be added to all created paragraphs.
|
||||
#
|
||||
# ==== Options
|
||||
|
@ -267,7 +267,7 @@ module ActionView
|
|||
|
||||
# Creates a Cycle object whose _to_s_ method cycles through elements of an
|
||||
# array every time it is called. This can be used for example, to alternate
|
||||
# classes for table rows. You can use named cycles to allow nesting in loops.
|
||||
# classes for table rows. You can use named cycles to allow nesting in loops.
|
||||
# Passing a Hash as the last parameter with a <tt>:name</tt> key will create a
|
||||
# named cycle. The default name for a cycle without a +:name+ key is
|
||||
# <tt>"default"</tt>. You can manually reset a cycle by calling reset_cycle
|
||||
|
|
|
@ -160,7 +160,7 @@ module ActionView
|
|||
#
|
||||
# ==== Examples
|
||||
# Because it relies on +url_for+, +link_to+ supports both older-style controller/action/id arguments
|
||||
# and newer RESTful routes. Current Rails style favors RESTful routes whenever possible, so base
|
||||
# and newer RESTful routes. Current Rails style favors RESTful routes whenever possible, so base
|
||||
# your application on resources and use
|
||||
#
|
||||
# link_to "Profile", profile_path(@profile)
|
||||
|
@ -348,7 +348,7 @@ module ActionView
|
|||
# Creates a link tag of the given +name+ using a URL created by the set of
|
||||
# +options+ unless the current request URI is the same as the links, in
|
||||
# which case only the name is returned (or the given block is yielded, if
|
||||
# one exists). You can give +link_to_unless_current+ a block which will
|
||||
# one exists). You can give +link_to_unless_current+ a block which will
|
||||
# specialize the default behavior (e.g., show a "Start Here" link rather
|
||||
# than the link's text).
|
||||
#
|
||||
|
@ -375,7 +375,7 @@ module ActionView
|
|||
# </ul>
|
||||
#
|
||||
# The implicit block given to +link_to_unless_current+ is evaluated if the current
|
||||
# action is the action given. So, if we had a comments page and wanted to render a
|
||||
# action is the action given. So, if we had a comments page and wanted to render a
|
||||
# "Go Back" link instead of a link to the comments page, we could do something like this...
|
||||
#
|
||||
# <%=
|
||||
|
@ -579,7 +579,7 @@ module ActionView
|
|||
url_string = url_for(options)
|
||||
|
||||
# We ignore any extra parameters in the request_uri if the
|
||||
# submitted url doesn't have any either. This lets the function
|
||||
# submitted url doesn't have any either. This lets the function
|
||||
# work with things like ?order=asc
|
||||
if url_string.index("?")
|
||||
request_uri = request.fullpath
|
||||
|
@ -641,7 +641,7 @@ module ActionView
|
|||
|
||||
# Processes the +html_options+ hash, converting the boolean
|
||||
# attributes from true/false form into the form required by
|
||||
# HTML/XHTML. (An attribute is considered to be boolean if
|
||||
# HTML/XHTML. (An attribute is considered to be boolean if
|
||||
# its name is listed in the given +bool_attrs+ array.)
|
||||
#
|
||||
# More specifically, for each boolean attribute in +html_options+
|
||||
|
@ -651,7 +651,7 @@ module ActionView
|
|||
#
|
||||
# if the associated +bool_value+ evaluates to true, it is
|
||||
# replaced with the attribute's name; otherwise the attribute is
|
||||
# removed from the +html_options+ hash. (See the XHTML 1.0 spec,
|
||||
# removed from the +html_options+ hash. (See the XHTML 1.0 spec,
|
||||
# section 4.5 "Attribute Minimization" for more:
|
||||
# http://www.w3.org/TR/xhtml1/#h-4.5)
|
||||
#
|
||||
|
|
|
@ -59,7 +59,7 @@ module ActiveModel
|
|||
# define_model_callbacks :initializer, :only => :after
|
||||
#
|
||||
# Note, the <tt>:only => <type></tt> hash will apply to all callbacks defined on
|
||||
# that method call. To get around this you can call the define_model_callbacks
|
||||
# that method call. To get around this you can call the define_model_callbacks
|
||||
# method as many times as you need.
|
||||
#
|
||||
# define_model_callbacks :create, :only => :after
|
||||
|
|
|
@ -49,8 +49,8 @@ module ActiveModel
|
|||
#
|
||||
# The last three methods are required in your object for Errors to be
|
||||
# able to generate error messages correctly and also handle multiple
|
||||
# languages. Of course, if you extend your object with ActiveModel::Translations
|
||||
# you will not need to implement the last two. Likewise, using
|
||||
# languages. Of course, if you extend your object with ActiveModel::Translations
|
||||
# you will not need to implement the last two. Likewise, using
|
||||
# ActiveModel::Validations will handle the validation related methods
|
||||
# for you.
|
||||
#
|
||||
|
@ -117,7 +117,7 @@ module ActiveModel
|
|||
end
|
||||
|
||||
# Iterates through each error key, value pair in the error messages hash.
|
||||
# Yields the attribute and the error for that attribute. If the attribute
|
||||
# Yields the attribute and the error for that attribute. If the attribute
|
||||
# has more than one error message, yields once for each error message.
|
||||
#
|
||||
# p.errors.add(:name, "can't be blank")
|
||||
|
|
|
@ -15,7 +15,7 @@ module ActiveModel
|
|||
disabled_observers.include?(observer.class)
|
||||
end
|
||||
|
||||
# Disables one or more observers. This supports multiple forms:
|
||||
# Disables one or more observers. This supports multiple forms:
|
||||
#
|
||||
# ORM.observers.disable :user_observer
|
||||
# # => disables the UserObserver
|
||||
|
@ -38,7 +38,7 @@ module ActiveModel
|
|||
set_enablement(false, observers, &block)
|
||||
end
|
||||
|
||||
# Enables one or more observers. This supports multiple forms:
|
||||
# Enables one or more observers. This supports multiple forms:
|
||||
#
|
||||
# ORM.observers.enable :user_observer
|
||||
# # => enables the UserObserver
|
||||
|
@ -59,7 +59,7 @@ module ActiveModel
|
|||
# # just the duration of the block
|
||||
# end
|
||||
#
|
||||
# Note: all observers are enabled by default. This method is only
|
||||
# Note: all observers are enabled by default. This method is only
|
||||
# useful when you have previously disabled one or more observers.
|
||||
def enable(*observers, &block)
|
||||
set_enablement(true, observers, &block)
|
||||
|
|
|
@ -31,7 +31,7 @@ module ActiveModel
|
|||
# you want to serialize and their current value.
|
||||
#
|
||||
# Most of the time though, you will want to include the JSON or XML
|
||||
# serializations. Both of these modules automatically include the
|
||||
# serializations. Both of these modules automatically include the
|
||||
# ActiveModel::Serialization module, so there is no need to explicitly
|
||||
# include it.
|
||||
#
|
||||
|
|
|
@ -55,10 +55,10 @@ module ActiveModel
|
|||
end
|
||||
|
||||
# To replicate the behavior in ActiveRecord#attributes, <tt>:except</tt>
|
||||
# takes precedence over <tt>:only</tt>. If <tt>:only</tt> is not set
|
||||
# takes precedence over <tt>:only</tt>. If <tt>:only</tt> is not set
|
||||
# for a N level model but is set for the N+1 level models,
|
||||
# then because <tt>:except</tt> is set to a default value, the second
|
||||
# level model can have both <tt>:except</tt> and <tt>:only</tt> set. So if
|
||||
# level model can have both <tt>:except</tt> and <tt>:only</tt> set. So if
|
||||
# <tt>:only</tt> is set, always delete <tt>:except</tt>.
|
||||
def attributes_hash
|
||||
attributes = @serializable.attributes
|
||||
|
|
|
@ -81,7 +81,7 @@ module ActiveModel
|
|||
# proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or
|
||||
# <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
def validates_each(*attr_names, &block)
|
||||
options = attr_names.extract_options!.symbolize_keys
|
||||
|
|
|
@ -49,7 +49,7 @@ module ActiveModel
|
|||
# before validation.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine
|
||||
# if the validation should occur (e.g. <tt>:if => :allow_validation</tt>,
|
||||
# or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false
|
||||
# value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to
|
||||
|
|
|
@ -50,7 +50,7 @@ module ActiveModel
|
|||
# and <tt>:update</tt>.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine
|
||||
# if the validation should occur (e.g. <tt>:if => :allow_validation</tt>,
|
||||
# or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false
|
||||
# value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to
|
||||
|
|
|
@ -54,10 +54,10 @@ module ActiveModel
|
|||
# validation contexts by default (+nil+), other options are <tt>:create</tt>
|
||||
# and <tt>:update</tt>.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
def validates_exclusion_of(*attr_names)
|
||||
validates_with ExclusionValidator, _merge_attributes(attr_names)
|
||||
|
|
|
@ -79,10 +79,10 @@ module ActiveModel
|
|||
# validation contexts by default (+nil+), other options are <tt>:create</tt>
|
||||
# and <tt>:update</tt>.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
def validates_format_of(*attr_names)
|
||||
validates_with FormatValidator, _merge_attributes(attr_names)
|
||||
|
|
|
@ -54,10 +54,10 @@ module ActiveModel
|
|||
# validation contexts by default (+nil+), other options are <tt>:create</tt>
|
||||
# and <tt>:update</tt>.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
def validates_inclusion_of(*attr_names)
|
||||
validates_with InclusionValidator, _merge_attributes(attr_names)
|
||||
|
|
|
@ -83,15 +83,15 @@ module ActiveModel
|
|||
# * <tt>:too_long</tt> - The error message if the attribute goes over the maximum (default is: "is too long (maximum is %{count} characters)").
|
||||
# * <tt>:too_short</tt> - The error message if the attribute goes under the minimum (default is: "is too short (min is %{count} characters)").
|
||||
# * <tt>:wrong_length</tt> - The error message if using the <tt>:is</tt> method and the attribute is the wrong size (default is: "is the wrong length (should be %{count} characters)").
|
||||
# * <tt>:message</tt> - The error message to use for a <tt>:minimum</tt>, <tt>:maximum</tt>, or <tt>:is</tt> violation. An alias of the appropriate <tt>too_long</tt>/<tt>too_short</tt>/<tt>wrong_length</tt> message.
|
||||
# * <tt>:message</tt> - The error message to use for a <tt>:minimum</tt>, <tt>:maximum</tt>, or <tt>:is</tt> violation. An alias of the appropriate <tt>too_long</tt>/<tt>too_short</tt>/<tt>wrong_length</tt> message.
|
||||
# * <tt>:on</tt> - Specifies when this validation is active. Runs in all
|
||||
# validation contexts by default (+nil+), other options are <tt>:create</tt>
|
||||
# and <tt>:update</tt>.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:tokenizer</tt> - Specifies how to split up the attribute string. (e.g. <tt>:tokenizer => lambda {|str| str.scan(/\w+/)}</tt> to
|
||||
# count words as in above example.)
|
||||
|
|
|
@ -102,10 +102,10 @@ module ActiveModel
|
|||
# * <tt>:odd</tt> - Specifies the value must be an odd number.
|
||||
# * <tt>:even</tt> - Specifies the value must be an even number.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
#
|
||||
# The following checks can also be supplied with a proc or a symbol which corresponds to a method:
|
||||
|
|
|
@ -215,7 +215,7 @@ Active Record is released under the MIT license.
|
|||
|
||||
API documentation is at
|
||||
|
||||
* http://api.rubyonrails.com
|
||||
* http://api.rubyonrails.org
|
||||
|
||||
Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
|
||||
|
||||
|
|
|
@ -176,7 +176,7 @@ module ActiveRecord
|
|||
# order in which mappings are defined determine the order in which attributes are sent to the
|
||||
# value class constructor.
|
||||
# * <tt>:allow_nil</tt> - Specifies that the value object will not be instantiated when all mapped
|
||||
# attributes are +nil+. Setting the value object to +nil+ has the effect of writing +nil+ to all
|
||||
# attributes are +nil+. Setting the value object to +nil+ has the effect of writing +nil+ to all
|
||||
# mapped attributes.
|
||||
# This defaults to +false+.
|
||||
# * <tt>:constructor</tt> - A symbol specifying the name of the constructor method or a Proc that
|
||||
|
|
|
@ -469,9 +469,9 @@ module ActiveRecord
|
|||
# === Association Join Models
|
||||
#
|
||||
# Has Many associations can be configured with the <tt>:through</tt> option to use an
|
||||
# explicit join model to retrieve the data. This operates similarly to a
|
||||
# +has_and_belongs_to_many+ association. The advantage is that you're able to add validations,
|
||||
# callbacks, and extra attributes on the join model. Consider the following schema:
|
||||
# explicit join model to retrieve the data. This operates similarly to a
|
||||
# +has_and_belongs_to_many+ association. The advantage is that you're able to add validations,
|
||||
# callbacks, and extra attributes on the join model. Consider the following schema:
|
||||
#
|
||||
# class Author < ActiveRecord::Base
|
||||
# has_many :authorships
|
||||
|
@ -528,7 +528,7 @@ module ActiveRecord
|
|||
# @group.avatars # selects all avatars by going through the User join model.
|
||||
#
|
||||
# An important caveat with going through +has_one+ or +has_many+ associations on the
|
||||
# join model is that these associations are *read-only*. For example, the following
|
||||
# join model is that these associations are *read-only*. For example, the following
|
||||
# would not work following the previous example:
|
||||
#
|
||||
# @group.avatars << Avatar.new # this would work if User belonged_to Avatar rather than the other way around
|
||||
|
@ -596,7 +596,7 @@ module ActiveRecord
|
|||
# === Polymorphic Associations
|
||||
#
|
||||
# Polymorphic associations on models are not restricted on what types of models they
|
||||
# can be associated with. Rather, they specify an interface that a +has_many+ association
|
||||
# can be associated with. Rather, they specify an interface that a +has_many+ association
|
||||
# must adhere to.
|
||||
#
|
||||
# class Asset < ActiveRecord::Base
|
||||
|
@ -610,7 +610,7 @@ module ActiveRecord
|
|||
# @asset.attachable = @post
|
||||
#
|
||||
# This works by using a type column in addition to a foreign key to specify the associated
|
||||
# record. In the Asset example, you'd need an +attachable_id+ integer column and an
|
||||
# record. In the Asset example, you'd need an +attachable_id+ integer column and an
|
||||
# +attachable_type+ string column.
|
||||
#
|
||||
# Using polymorphic associations in combination with single table inheritance (STI) is
|
||||
|
@ -666,7 +666,7 @@ module ActiveRecord
|
|||
#
|
||||
# Consider the following loop using the class above:
|
||||
#
|
||||
# for post in Post.all
|
||||
# Post.all.each do |post|
|
||||
# puts "Post: " + post.title
|
||||
# puts "Written by: " + post.author.name
|
||||
# puts "Last comment on: " + post.comments.first.created_on
|
||||
|
@ -675,7 +675,7 @@ module ActiveRecord
|
|||
# To iterate over these one hundred posts, we'll generate 201 database queries. Let's
|
||||
# first just optimize it for retrieving the author:
|
||||
#
|
||||
# for post in Post.find(:all, :include => :author)
|
||||
# Post.find(:all, :include => :author).each do |post|
|
||||
#
|
||||
# This references the name of the +belongs_to+ association that also used the <tt>:author</tt>
|
||||
# symbol. After loading the posts, find will collect the +author_id+ from each one and load
|
||||
|
@ -684,7 +684,7 @@ module ActiveRecord
|
|||
#
|
||||
# We can improve upon the situation further by referencing both associations in the finder with:
|
||||
#
|
||||
# for post in Post.find(:all, :include => [ :author, :comments ])
|
||||
# Post.find(:all, :include => [ :author, :comments ]).each do |post|
|
||||
#
|
||||
# This will load all comments with a single query. This reduces the total number of queries
|
||||
# to 3. More generally the number of queries will be 1 plus the number of associations
|
||||
|
@ -692,7 +692,7 @@ module ActiveRecord
|
|||
#
|
||||
# To include a deep hierarchy of associations, use a hash:
|
||||
#
|
||||
# for post in Post.find(:all, :include => [ :author, { :comments => { :author => :gravatar } } ])
|
||||
# Post.find(:all, :include => [ :author, { :comments => { :author => :gravatar } } ]).each do |post|
|
||||
#
|
||||
# That'll grab not only all the comments but all their authors and gravatar pictures.
|
||||
# You can mix and match symbols, arrays and hashes in any combination to describe the
|
||||
|
@ -741,7 +741,7 @@ module ActiveRecord
|
|||
# Picture.find(:first, :include => :most_recent_comments).most_recent_comments # => returns all associated comments.
|
||||
#
|
||||
# When eager loaded, conditions are interpolated in the context of the model class, not
|
||||
# the model instance. Conditions are lazily interpolated before the actual model exists.
|
||||
# the model instance. Conditions are lazily interpolated before the actual model exists.
|
||||
#
|
||||
# Eager loading is supported with polymorphic associations.
|
||||
#
|
||||
|
@ -765,7 +765,7 @@ module ActiveRecord
|
|||
# == Table Aliasing
|
||||
#
|
||||
# Active Record uses table aliasing in the case that a table is referenced multiple times
|
||||
# in a join. If a table is referenced only once, the standard table name is used. The
|
||||
# in a join. If a table is referenced only once, the standard table name is used. The
|
||||
# second time, the table is aliased as <tt>#{reflection_name}_#{parent_table_name}</tt>.
|
||||
# Indexes are appended for any more successive uses of the table name.
|
||||
#
|
||||
|
@ -847,7 +847,7 @@ module ActiveRecord
|
|||
# == Bi-directional associations
|
||||
#
|
||||
# When you specify an association there is usually an association on the associated model
|
||||
# that specifies the same relationship in reverse. For example, with the following models:
|
||||
# that specifies the same relationship in reverse. For example, with the following models:
|
||||
#
|
||||
# class Dungeon < ActiveRecord::Base
|
||||
# has_many :traps
|
||||
|
@ -864,9 +864,9 @@ module ActiveRecord
|
|||
#
|
||||
# The +traps+ association on +Dungeon+ and the +dungeon+ association on +Trap+ are
|
||||
# the inverse of each other and the inverse of the +dungeon+ association on +EvilWizard+
|
||||
# is the +evil_wizard+ association on +Dungeon+ (and vice-versa). By default,
|
||||
# is the +evil_wizard+ association on +Dungeon+ (and vice-versa). By default,
|
||||
# Active Record doesn't know anything about these inverse relationships and so no object
|
||||
# loading optimisation is possible. For example:
|
||||
# loading optimisation is possible. For example:
|
||||
#
|
||||
# d = Dungeon.first
|
||||
# t = d.traps.first
|
||||
|
@ -876,8 +876,8 @@ module ActiveRecord
|
|||
#
|
||||
# The +Dungeon+ instances +d+ and <tt>t.dungeon</tt> in the above example refer to
|
||||
# the same object data from the database, but are actually different in-memory copies
|
||||
# of that data. Specifying the <tt>:inverse_of</tt> option on associations lets you tell
|
||||
# Active Record about inverse relationships and it will optimise object loading. For
|
||||
# of that data. Specifying the <tt>:inverse_of</tt> option on associations lets you tell
|
||||
# Active Record about inverse relationships and it will optimise object loading. For
|
||||
# example, if we changed our model definitions to:
|
||||
#
|
||||
# class Dungeon < ActiveRecord::Base
|
||||
|
@ -1060,7 +1060,7 @@ module ActiveRecord
|
|||
# specify it with this option.
|
||||
# [:conditions]
|
||||
# Specify the conditions that the associated objects must meet in order to be included as a +WHERE+
|
||||
# SQL fragment, such as <tt>price > 5 AND name LIKE 'B%'</tt>. Record creations from
|
||||
# SQL fragment, such as <tt>price > 5 AND name LIKE 'B%'</tt>. Record creations from
|
||||
# the association are scoped if a hash is used.
|
||||
# <tt>has_many :posts, :conditions => {:published => true}</tt> will create published
|
||||
# posts with <tt>@blog.posts.create</tt> or <tt>@blog.posts.build</tt>.
|
||||
|
@ -1075,10 +1075,11 @@ module ActiveRecord
|
|||
# Specify the method that returns the primary key used for the association. By default this is +id+.
|
||||
# [:dependent]
|
||||
# If set to <tt>:destroy</tt> all the associated objects are destroyed
|
||||
# alongside this object by calling their +destroy+ method. If set to <tt>:delete_all</tt> all associated
|
||||
# objects are deleted *without* calling their +destroy+ method. If set to <tt>:nullify</tt> all associated
|
||||
# alongside this object by calling their +destroy+ method. If set to <tt>:delete_all</tt> all associated
|
||||
# objects are deleted *without* calling their +destroy+ method. If set to <tt>:nullify</tt> all associated
|
||||
# objects' foreign keys are set to +NULL+ *without* calling their +save+ callbacks. If set to
|
||||
# <tt>:restrict</tt> this object cannot be deleted if it has any associated object.
|
||||
# <tt>:restrict</tt> this object raises an <tt>ActiveRecord::DeleteRestrictionError</tt> exception and
|
||||
# cannot be deleted if it has any associated objects.
|
||||
#
|
||||
# If using with the <tt>:through</tt> option, the association on the join model must be
|
||||
# a +belongs_to+, and the records which get deleted are the join records, rather than
|
||||
|
@ -1227,7 +1228,8 @@ module ActiveRecord
|
|||
# If set to <tt>:destroy</tt>, the associated object is destroyed when this object is. If set to
|
||||
# <tt>:delete</tt>, the associated object is deleted *without* calling its destroy method.
|
||||
# If set to <tt>:nullify</tt>, the associated object's foreign key is set to +NULL+.
|
||||
# Also, association is assigned.
|
||||
# Also, association is assigned. If set to <tt>:restrict</tt> this object raises an
|
||||
# <tt>ActiveRecord::DeleteRestrictionError</tt> exception and cannot be deleted if it has any associated object.
|
||||
# [:foreign_key]
|
||||
# Specify the foreign key used for the association. By default this is guessed to be the name
|
||||
# of this class in lower-case and "_id" suffixed. So a Person class that makes a +has_one+ association
|
||||
|
@ -1243,7 +1245,7 @@ module ActiveRecord
|
|||
# you want to do a join but not include the joined columns. Do not forget to include the
|
||||
# primary and foreign keys, otherwise it will raise an error.
|
||||
# [:through]
|
||||
# Specifies a Join Model through which to perform the query. Options for <tt>:class_name</tt>,
|
||||
# Specifies a Join Model through which to perform the query. Options for <tt>:class_name</tt>,
|
||||
# <tt>:primary_key</tt>, and <tt>:foreign_key</tt> are ignored, as the association uses the
|
||||
# source reflection. You can only use a <tt>:through</tt> query through a <tt>has_one</tt>
|
||||
# or <tt>belongs_to</tt> association on the join model.
|
||||
|
@ -1265,7 +1267,7 @@ module ActiveRecord
|
|||
# By default, only save the associated object if it's a new record.
|
||||
# [:inverse_of]
|
||||
# Specifies the name of the <tt>belongs_to</tt> association on the associated object
|
||||
# that is the inverse of this <tt>has_one</tt> association. Does not work in combination
|
||||
# that is the inverse of this <tt>has_one</tt> association. Does not work in combination
|
||||
# with <tt>:through</tt> or <tt>:as</tt> options.
|
||||
# See ActiveRecord::Associations::ClassMethods's overview on Bi-directional associations for more detail.
|
||||
#
|
||||
|
@ -1383,7 +1385,7 @@ module ActiveRecord
|
|||
# will be updated with the current time in addition to the updated_at/on attribute.
|
||||
# [:inverse_of]
|
||||
# Specifies the name of the <tt>has_one</tt> or <tt>has_many</tt> association on the associated
|
||||
# object that is the inverse of this <tt>belongs_to</tt> association. Does not work in
|
||||
# object that is the inverse of this <tt>belongs_to</tt> association. Does not work in
|
||||
# combination with the <tt>:polymorphic</tt> options.
|
||||
# See ActiveRecord::Associations::ClassMethods's overview on Bi-directional associations for more detail.
|
||||
#
|
||||
|
@ -1403,15 +1405,15 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
# Specifies a many-to-many relationship with another class. This associates two classes via an
|
||||
# intermediate join table. Unless the join table is explicitly specified as an option, it is
|
||||
# intermediate join table. Unless the join table is explicitly specified as an option, it is
|
||||
# guessed using the lexical order of the class names. So a join between Developer and Project
|
||||
# will give the default join table name of "developers_projects" because "D" outranks "P".
|
||||
# Note that this precedence is calculated using the <tt><</tt> operator for String. This
|
||||
# Note that this precedence is calculated using the <tt><</tt> operator for String. This
|
||||
# means that if the strings are of different lengths, and the strings are equal when compared
|
||||
# up to the shortest length, then the longer string is considered of higher
|
||||
# lexical precedence than the shorter one. For example, one would expect the tables "paper_boxes" and "papers"
|
||||
# lexical precedence than the shorter one. For example, one would expect the tables "paper_boxes" and "papers"
|
||||
# to generate a join table name of "papers_paper_boxes" because of the length of the name "paper_boxes",
|
||||
# but it in fact generates a join table name of "paper_boxes_papers". Be aware of this caveat, and use the
|
||||
# but it in fact generates a join table name of "paper_boxes_papers". Be aware of this caveat, and use the
|
||||
# custom <tt>:join_table</tt> option if you need to.
|
||||
#
|
||||
# The join table should not have a primary key or a model associated with it. You must manually generate the
|
||||
|
@ -1513,7 +1515,7 @@ module ActiveRecord
|
|||
# the association will use "project_id" as the default <tt>:association_foreign_key</tt>.
|
||||
# [:conditions]
|
||||
# Specify the conditions that the associated object must meet in order to be included as a +WHERE+
|
||||
# SQL fragment, such as <tt>authorized = 1</tt>. Record creations from the association are
|
||||
# SQL fragment, such as <tt>authorized = 1</tt>. Record creations from the association are
|
||||
# scoped if a hash is used.
|
||||
# <tt>has_many :posts, :conditions => {:published => true}</tt> will create published posts with <tt>@blog.posts.create</tt>
|
||||
# or <tt>@blog.posts.build</tt>.
|
||||
|
|
|
@ -126,7 +126,7 @@ module ActiveRecord
|
|||
record
|
||||
end
|
||||
|
||||
# Add +records+ to this association. Returns +self+ so method calls may be chained.
|
||||
# Add +records+ to this association. Returns +self+ so method calls may be chained.
|
||||
# Since << flattens its argument list and inserts each record, +push+ and +concat+ behave identically.
|
||||
def concat(*records)
|
||||
result = true
|
||||
|
|
|
@ -18,7 +18,7 @@ module ActiveRecord
|
|||
#
|
||||
# If the association has a counter cache it gets that value. Otherwise
|
||||
# it will attempt to do a count via SQL, bounded to <tt>:limit</tt> if
|
||||
# there's one. Some configuration options like :group make it impossible
|
||||
# there's one. Some configuration options like :group make it impossible
|
||||
# to do an SQL count, in those cases the array count will be used.
|
||||
#
|
||||
# That does not depend on whether the collection has already been loaded
|
||||
|
|
|
@ -58,7 +58,7 @@ module ActiveRecord
|
|||
generated_attribute_methods.module_eval("def _#{attr_name}; #{access_code}; end; alias #{attr_name} _#{attr_name}", __FILE__, __LINE__)
|
||||
end
|
||||
|
||||
# Define an attribute reader method. Cope with nil column.
|
||||
# Define an attribute reader method. Cope with nil column.
|
||||
# method_name is the same as attr_name except when a non-standard primary key is used,
|
||||
# we still define #id as an accessor for the key
|
||||
def define_read_method(method_name, attr_name, column)
|
||||
|
|
|
@ -161,7 +161,7 @@ module ActiveRecord
|
|||
#
|
||||
# For performance reasons, we don't check whether to validate at runtime.
|
||||
# However the validation and callback methods are lazy and those methods
|
||||
# get created when they are invoked for the very first time. However,
|
||||
# get created when they are invoked for the very first time. However,
|
||||
# this can change, for instance, when using nested attributes, which is
|
||||
# called _after_ the association has been defined. Since we don't want
|
||||
# the callbacks to get defined multiple times, there are guards that
|
||||
|
|
|
@ -165,7 +165,7 @@ module ActiveRecord
|
|||
checkin conn if conn
|
||||
end
|
||||
|
||||
# If a connection already exists yield it to the block. If no connection
|
||||
# If a connection already exists yield it to the block. If no connection
|
||||
# exists checkout a connection, yield it to the block, and checkin the
|
||||
# connection when finished.
|
||||
def with_connection
|
||||
|
|
|
@ -42,7 +42,7 @@ module ActiveRecord
|
|||
undef_method :execute
|
||||
|
||||
# Executes +sql+ statement in the context of this connection using
|
||||
# +binds+ as the bind substitutes. +name+ is logged along with
|
||||
# +binds+ as the bind substitutes. +name+ is logged along with
|
||||
# the executed +sql+ statement.
|
||||
def exec_query(sql, name = 'SQL', binds = [])
|
||||
end
|
||||
|
@ -276,7 +276,7 @@ module ActiveRecord
|
|||
|
||||
# Set the sequence to the max value of the table's column.
|
||||
def reset_sequence!(table, column, sequence = nil)
|
||||
# Do nothing by default. Implement for PostgreSQL, Oracle, ...
|
||||
# Do nothing by default. Implement for PostgreSQL, Oracle, ...
|
||||
end
|
||||
|
||||
# Inserts the given fixture into the table. Overridden in adapters that require
|
||||
|
|
|
@ -4,7 +4,7 @@ module ActiveRecord
|
|||
module ConnectionAdapters # :nodoc:
|
||||
module SchemaStatements
|
||||
# Returns a Hash of mappings from the abstract data types to the native
|
||||
# database types. See TableDefinition#column for details on the recognized
|
||||
# database types. See TableDefinition#column for details on the recognized
|
||||
# abstract data types.
|
||||
def native_database_types
|
||||
{}
|
||||
|
@ -78,7 +78,7 @@ module ActiveRecord
|
|||
# Creates a new table with the name +table_name+. +table_name+ may either
|
||||
# be a String or a Symbol.
|
||||
#
|
||||
# There are two ways to work with +create_table+. You can use the block
|
||||
# There are two ways to work with +create_table+. You can use the block
|
||||
# form or the regular form, like this:
|
||||
#
|
||||
# === Block form
|
||||
|
@ -299,7 +299,7 @@ module ActiveRecord
|
|||
raise NotImplementedError, "rename_column is not implemented"
|
||||
end
|
||||
|
||||
# Adds a new index to the table. +column_name+ can be a single Symbol, or
|
||||
# Adds a new index to the table. +column_name+ can be a single Symbol, or
|
||||
# an Array of Symbols.
|
||||
#
|
||||
# The index will be named after the table and the first column name,
|
||||
|
|
|
@ -406,7 +406,7 @@ module ActiveRecord
|
|||
|
||||
def exec_without_stmt(sql, name = 'SQL') # :nodoc:
|
||||
# Some queries, like SHOW CREATE TABLE don't work through the prepared
|
||||
# statement API. For those queries, we need to use this method. :'(
|
||||
# statement API. For those queries, we need to use this method. :'(
|
||||
log(sql, name) do
|
||||
result = @connection.query(sql)
|
||||
cols = []
|
||||
|
@ -832,7 +832,7 @@ module ActiveRecord
|
|||
stmt.execute(*binds.map { |col, val| type_cast(val, col) })
|
||||
rescue Mysql::Error => e
|
||||
# Older versions of MySQL leave the prepared statement in a bad
|
||||
# place when an error occurs. To support older mysql versions, we
|
||||
# place when an error occurs. To support older mysql versions, we
|
||||
# need to close the statement and delete the statement from the
|
||||
# cache.
|
||||
stmt.close
|
||||
|
|
|
@ -198,7 +198,7 @@ module ActiveRecord
|
|||
# * <tt>:password</tt> - Defaults to nothing.
|
||||
# * <tt>:database</tt> - The name of the database. No default, must be provided.
|
||||
# * <tt>:schema_search_path</tt> - An optional schema search path for the connection given
|
||||
# as a string of comma-separated schema names. This is backward-compatible with the <tt>:schema_order</tt> option.
|
||||
# as a string of comma-separated schema names. This is backward-compatible with the <tt>:schema_order</tt> option.
|
||||
# * <tt>:encoding</tt> - An optional client encoding that is used in a <tt>SET client_encoding TO
|
||||
# <encoding></tt> call on the connection.
|
||||
# * <tt>:min_messages</tt> - An optional client min messages that is used in a
|
||||
|
@ -618,7 +618,7 @@ module ActiveRecord
|
|||
create_database(name)
|
||||
end
|
||||
|
||||
# Create a new PostgreSQL database. Options include <tt>:owner</tt>, <tt>:template</tt>,
|
||||
# Create a new PostgreSQL database. Options include <tt>:owner</tt>, <tt>:template</tt>,
|
||||
# <tt>:encoding</tt>, <tt>:tablespace</tt>, and <tt>:connection_limit</tt> (note that MySQL uses
|
||||
# <tt>:charset</tt> while PostgreSQL uses <tt>:encoding</tt>).
|
||||
#
|
||||
|
|
|
@ -2,7 +2,7 @@ module ActiveRecord
|
|||
# = Active Record Counter Cache
|
||||
module CounterCache
|
||||
# Resets one or more counter caches to their correct value using an SQL
|
||||
# count query. This is useful when adding new counter caches, or if the
|
||||
# count query. This is useful when adding new counter caches, or if the
|
||||
# counter has been corrupted or modified directly by SQL.
|
||||
#
|
||||
# ==== Parameters
|
||||
|
|
|
@ -54,14 +54,14 @@ class FixturesFileNotFound < StandardError; end
|
|||
# name: Google
|
||||
# url: http://www.google.com
|
||||
#
|
||||
# This YAML fixture file includes two fixtures. Each YAML fixture (ie. record) is given a name and is followed by an
|
||||
# indented list of key/value pairs in the "key: value" format. Records are separated by a blank line for your viewing
|
||||
# This YAML fixture file includes two fixtures. Each YAML fixture (ie. record) is given a name and is followed by an
|
||||
# indented list of key/value pairs in the "key: value" format. Records are separated by a blank line for your viewing
|
||||
# pleasure.
|
||||
#
|
||||
# Note that YAML fixtures are unordered. If you want ordered fixtures, use the omap YAML type.
|
||||
# See http://yaml.org/type/omap.html
|
||||
# for the specification. You will need ordered fixtures when you have foreign key constraints on keys in the same table.
|
||||
# This is commonly needed for tree structures. Example:
|
||||
# for the specification. You will need ordered fixtures when you have foreign key constraints on keys in the same table.
|
||||
# This is commonly needed for tree structures. Example:
|
||||
#
|
||||
# --- !omap
|
||||
# - parent:
|
||||
|
@ -75,7 +75,7 @@ class FixturesFileNotFound < StandardError; end
|
|||
#
|
||||
# = Using fixtures in testcases
|
||||
#
|
||||
# Since fixtures are a testing construct, we use them in our unit and functional tests. There are two ways to use the
|
||||
# Since fixtures are a testing construct, we use them in our unit and functional tests. There are two ways to use the
|
||||
# fixtures, but first let's take a look at a sample unit test:
|
||||
#
|
||||
# require 'test_helper'
|
||||
|
@ -558,7 +558,7 @@ module ActiveRecord
|
|||
fixtures.size
|
||||
end
|
||||
|
||||
# Return a hash of rows to be inserted. The key is the table, the value is
|
||||
# Return a hash of rows to be inserted. The key is the table, the value is
|
||||
# a list of rows to insert to that table.
|
||||
def table_rows
|
||||
now = ActiveRecord::Base.default_timezone == :utc ? Time.now.utc : Time.now
|
||||
|
|
|
@ -14,7 +14,7 @@ module ActiveRecord
|
|||
# Account.transaction do
|
||||
# # select * from accounts where name = 'shugo' limit 1 for update
|
||||
# shugo = Account.where("name = 'shugo'").lock(true).first
|
||||
# yuko = Account.where("name = 'shugo'").lock(true).first
|
||||
# yuko = Account.where("name = 'yuko'").lock(true).first
|
||||
# shugo.balance -= 100
|
||||
# shugo.save!
|
||||
# yuko.balance += 100
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActiveRecord
|
||||
class Migration
|
||||
# ActiveRecord::Migration::CommandRecorder records commands done during
|
||||
# a migration and knows how to reverse those commands. The CommandRecorder
|
||||
# a migration and knows how to reverse those commands. The CommandRecorder
|
||||
# knows how to invert the following commands:
|
||||
#
|
||||
# * add_column
|
||||
|
@ -20,7 +20,7 @@ module ActiveRecord
|
|||
@delegate = delegate
|
||||
end
|
||||
|
||||
# record +command+. +command+ should be a method name and arguments.
|
||||
# record +command+. +command+ should be a method name and arguments.
|
||||
# For example:
|
||||
#
|
||||
# recorder.record(:method_name, [:arg1, arg2])
|
||||
|
@ -29,7 +29,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
# Returns a list that represents commands that are the inverse of the
|
||||
# commands stored in +commands+. For example:
|
||||
# commands stored in +commands+. For example:
|
||||
#
|
||||
# recorder.record(:rename_table, [:old, :new])
|
||||
# recorder.inverse # => [:rename_table, [:new, :old]]
|
||||
|
|
|
@ -137,6 +137,8 @@ module ActiveRecord
|
|||
# * Callbacks are skipped.
|
||||
# * updated_at/updated_on column is not updated if that column is available.
|
||||
#
|
||||
# Raises an +ActiveRecordError+ when called on new objects, or when the +name+
|
||||
# attribute is marked as readonly.
|
||||
def update_column(name, value)
|
||||
name = name.to_s
|
||||
raise ActiveRecordError, "#{name} is marked as readonly" if self.class.readonly_attributes.include?(name)
|
||||
|
|
|
@ -379,7 +379,7 @@ module ActiveRecord
|
|||
delegate :foreign_key, :foreign_type, :association_foreign_key,
|
||||
:active_record_primary_key, :type, :to => :source_reflection
|
||||
|
||||
# Gets the source of the through reflection. It checks both a singularized
|
||||
# Gets the source of the through reflection. It checks both a singularized
|
||||
# and pluralized form for <tt>:belongs_to</tt> or <tt>:has_many</tt>.
|
||||
#
|
||||
# class Post < ActiveRecord::Base
|
||||
|
|
|
@ -293,7 +293,7 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
# Destroy an object (or multiple objects) that has the given id, the object is instantiated first,
|
||||
# therefore all callbacks and filters are fired off before the object is deleted. This method is
|
||||
# therefore all callbacks and filters are fired off before the object is deleted. This method is
|
||||
# less efficient than ActiveRecord#delete but allows cleanup methods and other actions to be run.
|
||||
#
|
||||
# This essentially finds the object (or multiple objects) with the given id, creates a new object
|
||||
|
@ -322,7 +322,7 @@ module ActiveRecord
|
|||
# Deletes the records matching +conditions+ without instantiating the records first, and hence not
|
||||
# calling the +destroy+ method nor invoking callbacks. This is a single SQL DELETE statement that
|
||||
# goes straight to the database, much more efficient than +destroy_all+. Be careful with relations
|
||||
# though, in particular <tt>:dependent</tt> rules defined on associations are not honored. Returns
|
||||
# though, in particular <tt>:dependent</tt> rules defined on associations are not honored. Returns
|
||||
# the number of rows affected.
|
||||
#
|
||||
# ==== Parameters
|
||||
|
|
|
@ -66,7 +66,7 @@ module ActiveRecord
|
|||
calculate(:average, column_name, options)
|
||||
end
|
||||
|
||||
# Calculates the minimum value on a given column. The value is returned
|
||||
# Calculates the minimum value on a given column. The value is returned
|
||||
# with the same data type of the column, or +nil+ if there's no row. See
|
||||
# +calculate+ for examples with options.
|
||||
#
|
||||
|
@ -93,7 +93,7 @@ module ActiveRecord
|
|||
calculate(:sum, column_name, options)
|
||||
end
|
||||
|
||||
# This calculates aggregate values in the given column. Methods for count, sum, average,
|
||||
# This calculates aggregate values in the given column. Methods for count, sum, average,
|
||||
# minimum, and maximum have been added as shortcuts. Options such as <tt>:conditions</tt>,
|
||||
# <tt>:order</tt>, <tt>:group</tt>, <tt>:having</tt>, and <tt>:joins</tt> can be passed to customize the query.
|
||||
#
|
||||
|
@ -101,7 +101,7 @@ module ActiveRecord
|
|||
# * Single aggregate value: The single value is type cast to Fixnum for COUNT, Float
|
||||
# for AVG, and the given column's type for everything else.
|
||||
# * Grouped values: This returns an ordered hash of the values and groups them by the
|
||||
# <tt>:group</tt> option. It takes either a column name, or the name of a belongs_to association.
|
||||
# <tt>:group</tt> option. It takes either a column name, or the name of a belongs_to association.
|
||||
#
|
||||
# values = Person.maximum(:age, :group => 'last_name')
|
||||
# puts values["Drake"]
|
||||
|
@ -119,7 +119,7 @@ module ActiveRecord
|
|||
# Options:
|
||||
# * <tt>:conditions</tt> - An SQL fragment like "administrator = 1" or [ "user_name = ?", username ].
|
||||
# See conditions in the intro to ActiveRecord::Base.
|
||||
# * <tt>:include</tt>: Eager loading, see Associations for details. Since calculations don't load anything,
|
||||
# * <tt>:include</tt>: Eager loading, see Associations for details. Since calculations don't load anything,
|
||||
# the purpose of this is to access fields on joined tables in your conditions, order, or group clauses.
|
||||
# * <tt>:joins</tt> - An SQL fragment for additional joins like "LEFT JOIN comments ON comments.post_id = id".
|
||||
# (Rarely needed).
|
||||
|
|
|
@ -83,7 +83,7 @@ module ActiveRecord
|
|||
#
|
||||
# Example for find with a lock: Imagine two concurrent transactions:
|
||||
# each will read <tt>person.visits == 2</tt>, add 1 to it, and save, resulting
|
||||
# in two saves of <tt>person.visits = 3</tt>. By locking the row, the second
|
||||
# in two saves of <tt>person.visits = 3</tt>. By locking the row, the second
|
||||
# transaction has to wait until the first is finished; we get the
|
||||
# expected <tt>person.visits == 4</tt>.
|
||||
#
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActiveRecord
|
||||
###
|
||||
# This class encapsulates a Result returned from calling +exec_query+ on any
|
||||
# database connection adapter. For example:
|
||||
# database connection adapter. For example:
|
||||
#
|
||||
# x = ActiveRecord::Base.connection.exec_query('SELECT * FROM foo')
|
||||
# x # => #<ActiveRecord::Result:0xdeadbeef>
|
||||
|
|
|
@ -106,7 +106,7 @@ HEADER
|
|||
spec = {}
|
||||
spec[:name] = column.name.inspect
|
||||
|
||||
# AR has an optimisation which handles zero-scale decimals as integers. This
|
||||
# AR has an optimisation which handles zero-scale decimals as integers. This
|
||||
# code ensures that the dumper still dumps the column as a decimal.
|
||||
spec[:type] = if column.type == :integer && [/^numeric/, /^decimal/].any? { |e| e.match(column.sql_type) }
|
||||
'decimal'
|
||||
|
|
|
@ -75,7 +75,7 @@ module ActiveRecord #:nodoc:
|
|||
# </firm>
|
||||
#
|
||||
# Additionally, the record being serialized will be passed to a Proc's second
|
||||
# parameter. This allows for ad hoc additions to the resultant document that
|
||||
# parameter. This allows for ad hoc additions to the resultant document that
|
||||
# incorporate the context of the record being serialized. And by leveraging the
|
||||
# closure created by a Proc, to_xml can be used to add elements that normally fall
|
||||
# outside of the scope of the model -- for example, generating and appending URLs
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActiveRecord
|
||||
# = Active Record Session Store
|
||||
#
|
||||
# A session store backed by an Active Record class. A default class is
|
||||
# A session store backed by an Active Record class. A default class is
|
||||
# provided, but any object duck-typing to an Active Record Session class
|
||||
# with text +session_id+ and +data+ attributes is sufficient.
|
||||
#
|
||||
|
@ -23,7 +23,7 @@ module ActiveRecord
|
|||
# ActiveRecord::SessionStore::Session.data_column_name = 'legacy_session_data'
|
||||
#
|
||||
# Note that setting the primary key to the +session_id+ frees you from
|
||||
# having a separate +id+ column if you don't want it. However, you must
|
||||
# having a separate +id+ column if you don't want it. However, you must
|
||||
# set <tt>session.model.id = session.session_id</tt> by hand! A before filter
|
||||
# on ApplicationController is a good place.
|
||||
#
|
||||
|
@ -46,7 +46,7 @@ module ActiveRecord
|
|||
# save
|
||||
# destroy
|
||||
#
|
||||
# The example SqlBypass class is a generic SQL session store. You may
|
||||
# The example SqlBypass class is a generic SQL session store. You may
|
||||
# use it as a basis for high-performance database-specific stores.
|
||||
class SessionStore < ActionDispatch::Session::AbstractStore
|
||||
module ClassMethods # :nodoc:
|
||||
|
@ -79,7 +79,7 @@ module ActiveRecord
|
|||
|
||||
##
|
||||
# :singleton-method:
|
||||
# Customizable data column name. Defaults to 'data'.
|
||||
# Customizable data column name. Defaults to 'data'.
|
||||
cattr_accessor :data_column_name
|
||||
self.data_column_name = 'data'
|
||||
|
||||
|
@ -161,12 +161,12 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
# A barebones session store which duck-types with the default session
|
||||
# store but bypasses Active Record and issues SQL directly. This is
|
||||
# store but bypasses Active Record and issues SQL directly. This is
|
||||
# an example session model class meant as a basis for your own classes.
|
||||
#
|
||||
# The database connection, table name, and session id and data columns
|
||||
# are configurable class attributes. Marshaling and unmarshaling
|
||||
# are implemented as class methods that you may override. By default,
|
||||
# are configurable class attributes. Marshaling and unmarshaling
|
||||
# are implemented as class methods that you may override. By default,
|
||||
# marshaling data is
|
||||
#
|
||||
# ActiveSupport::Base64.encode64(Marshal.dump(data))
|
||||
|
@ -176,7 +176,7 @@ module ActiveRecord
|
|||
# Marshal.load(ActiveSupport::Base64.decode64(data))
|
||||
#
|
||||
# This marshaling behavior is intended to store the widest range of
|
||||
# binary session data in a +text+ column. For higher performance,
|
||||
# binary session data in a +text+ column. For higher performance,
|
||||
# store in a +blob+ column instead and forgo the Base64 encoding.
|
||||
class SqlBypass
|
||||
extend ClassMethods
|
||||
|
@ -286,7 +286,7 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
# The class used for session storage. Defaults to
|
||||
# The class used for session storage. Defaults to
|
||||
# ActiveRecord::SessionStore::Session
|
||||
cattr_accessor :session_class
|
||||
self.session_class = Session
|
||||
|
|
|
@ -13,7 +13,7 @@ module ActiveRecord
|
|||
ActiveRecord::IdentityMap.clear
|
||||
end
|
||||
|
||||
# Backport skip to Ruby 1.8. test/unit doesn't support it, so just
|
||||
# Backport skip to Ruby 1.8. test/unit doesn't support it, so just
|
||||
# make it a noop.
|
||||
unless instance_methods.map(&:to_s).include?("skip")
|
||||
def skip(message)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActiveRecord
|
||||
# = Active Record RecordInvalid
|
||||
#
|
||||
# Raised by <tt>save!</tt> and <tt>create!</tt> when the record is invalid. Use the
|
||||
# Raised by <tt>save!</tt> and <tt>create!</tt> when the record is invalid. Use the
|
||||
# +record+ method to retrieve the record which did not validate.
|
||||
#
|
||||
# begin
|
||||
|
|
|
@ -37,10 +37,10 @@ module ActiveRecord
|
|||
# validation contexts by default (+nil+), other options are <tt>:create</tt>
|
||||
# and <tt>:update</tt>.
|
||||
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# occur (e.g. <tt>:if => :allow_validation</tt>, or <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The
|
||||
# method, proc or string should return or evaluate to a true or false value.
|
||||
def validates_associated(*attr_names)
|
||||
validates_with AssociatedValidator, _merge_attributes(attr_names)
|
||||
|
|
|
@ -83,7 +83,7 @@ module ActiveRecord
|
|||
# validates_uniqueness_of :user_name, :scope => :account_id
|
||||
# end
|
||||
#
|
||||
# Or even multiple scope parameters. For example, making sure that a teacher can only be on the schedule once
|
||||
# Or even multiple scope parameters. For example, making sure that a teacher can only be on the schedule once
|
||||
# per semester for a particular class.
|
||||
#
|
||||
# class TeacherSchedule < ActiveRecord::Base
|
||||
|
@ -105,7 +105,7 @@ module ActiveRecord
|
|||
# The method, proc or string should return or evaluate to a true or false value.
|
||||
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine if the validation should
|
||||
# not occur (e.g. <tt>:unless => :skip_validation</tt>, or
|
||||
# <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The method, proc or string should
|
||||
# <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The method, proc or string should
|
||||
# return or evaluate to a true or false value.
|
||||
#
|
||||
# === Concurrency and integrity
|
||||
|
|
|
@ -20,6 +20,16 @@ Model classes are mapped to remote REST resources by Active Resource much the sa
|
|||
tables. When a request is made to a remote resource, a REST XML request is generated, transmitted, and the result
|
||||
received and serialized into a usable Ruby object.
|
||||
|
||||
== Download and installation
|
||||
|
||||
The latest version of Active Support can be installed with Rubygems:
|
||||
|
||||
% [sudo] gem install activeresource
|
||||
|
||||
Source code can be downloaded as part of the Rails project on GitHub
|
||||
|
||||
* https://github.com/rails/rails/tree/master/activeresource/
|
||||
|
||||
=== Configuration and Usage
|
||||
|
||||
Putting Active Resource to use is very similar to Active Record. It's as simple as creating a model class
|
||||
|
@ -160,6 +170,18 @@ Destruction of a resource can be invoked as a class and instance method of the r
|
|||
Person.delete(2) # => true
|
||||
Person.exists?(2) # => false
|
||||
|
||||
== License
|
||||
|
||||
Active Support is released under the MIT license.
|
||||
|
||||
== Support
|
||||
|
||||
API documentation is at
|
||||
|
||||
* http://api.rubyonrails.org
|
||||
|
||||
Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
|
||||
|
||||
* https://github.com/rails/rails/issues
|
||||
|
||||
You can find more usage information in the ActiveResource::Base documentation.
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ Active Support is released under the MIT license.
|
|||
|
||||
API documentation is at
|
||||
|
||||
* http://api.rubyonrails.com
|
||||
* http://api.rubyonrails.org
|
||||
|
||||
Bug reports and feature requests can be filed with the rest for the Ruby on Rails project here:
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ module ActiveSupport
|
|||
# Allows you to measure the execution time of a block
|
||||
# in a template and records the result to the log. Wrap this block around
|
||||
# expensive operations or possible bottlenecks to get a time reading
|
||||
# for the operation. For example, let's say you thought your file
|
||||
# for the operation. For example, let's say you thought your file
|
||||
# processing method was taking too long; you could wrap it in a benchmark block.
|
||||
#
|
||||
# <% benchmark "Process data files" do %>
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'active_support/core_ext/object/duplicable'
|
|||
require 'active_support/core_ext/array/extract_options'
|
||||
require 'active_support/deprecation'
|
||||
|
||||
# Retained for backward compatibility. Methods are now included in Class.
|
||||
# Retained for backward compatibility. Methods are now included in Class.
|
||||
module ClassInheritableAttributes # :nodoc:
|
||||
DEPRECATION_WARNING_MESSAGE = "class_inheritable_attribute is deprecated, please use class_attribute method instead. Notice their behavior are slightly different, so refer to class_attribute documentation first"
|
||||
end
|
||||
|
|
|
@ -103,7 +103,7 @@ class Date
|
|||
alias_method :minus_without_duration, :-
|
||||
alias_method :-, :minus_with_duration
|
||||
|
||||
# Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
|
||||
# Provides precise Date calculations for years, months, and days. The +options+ parameter takes a hash with
|
||||
# any of these keys: <tt>:years</tt>, <tt>:months</tt>, <tt>:weeks</tt>, <tt>:days</tt>.
|
||||
def advance(options)
|
||||
options = options.dup
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class File
|
||||
# Write to a file atomically. Useful for situations where you don't
|
||||
# Write to a file atomically. Useful for situations where you don't
|
||||
# want other processes or threads to see half-written files.
|
||||
#
|
||||
# File.atomic_write("important.file") do |file|
|
||||
|
|
|
@ -1,11 +1,11 @@
|
|||
class Object
|
||||
# Makes backticks behave (somewhat more) similarly on all platforms.
|
||||
# On win32 `nonexistent_command` raises Errno::ENOENT; on Unix, the
|
||||
# spawned shell prints a message to stderr and sets $?. We emulate
|
||||
# spawned shell prints a message to stderr and sets $?. We emulate
|
||||
# Unix on the former but not the latter.
|
||||
def `(command) #:nodoc:
|
||||
super
|
||||
rescue Errno::ENOENT => e
|
||||
STDERR.puts "#$0: #{e}"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -22,7 +22,7 @@ class Object
|
|||
# <tt>object.presence</tt> is equivalent to <tt>object.present? ? object : nil</tt>.
|
||||
#
|
||||
# This is handy for any representation of objects where blank is the same
|
||||
# as not present at all. For example, this simplifies a common check for
|
||||
# as not present at all. For example, this simplifies a common check for
|
||||
# HTTP POST/query parameters:
|
||||
#
|
||||
# state = params[:state] if params[:state].present?
|
||||
|
|
|
@ -652,7 +652,7 @@ module ActiveSupport #:nodoc:
|
|||
end
|
||||
|
||||
class LoadingModule #:nodoc:
|
||||
# Old style environment.rb referenced this method directly. Please note, it doesn't
|
||||
# Old style environment.rb referenced this method directly. Please note, it doesn't
|
||||
# actually *do* anything any more.
|
||||
def self.root(*args)
|
||||
if defined?(Rails) && Rails.logger
|
||||
|
|
|
@ -61,7 +61,7 @@ h4. Upgrade Process
|
|||
|
||||
To help with the upgrade process, a plugin named "Rails Upgrade":http://github.com/jm/rails_upgrade has been created to automate part of it.
|
||||
|
||||
Simply install the plugin, then run +rake rails:upgrade:check+ to check your app for pieces that need to be updated (with links to information on how to update them). It also offers a task to generate a +Gemfile+ based on your current +config.gem+ calls and a task to generate a new routes file from your current one. To get the plugin, simply run the following:
|
||||
Simply install the plugin, then run +rake rails:upgrade:check+ to check your app for pieces that need to be updated (with links to information on how to update them). It also offers a task to generate a +Gemfile+ based on your current +config.gem+ calls and a task to generate a new routes file from your current one. To get the plugin, simply run the following:
|
||||
|
||||
<shell>
|
||||
$ ruby script/plugin install git://github.com/jm/rails_upgrade.git
|
||||
|
@ -69,7 +69,7 @@ $ ruby script/plugin install git://github.com/jm/rails_upgrade.git
|
|||
|
||||
You can see an example of how that works at "Rails Upgrade is now an Official Plugin":http://omgbloglol.com/post/364624593/rails-upgrade-is-now-an-official-plugin
|
||||
|
||||
Aside from Rails Upgrade tool, if you need more help, there are people on IRC and "rubyonrails-talk":http://groups.google.com/group/rubyonrails-talk that are probably doing the same thing, possibly hitting the same issues. Be sure to blog your own experiences when upgrading so others can benefit from your knowledge!
|
||||
Aside from Rails Upgrade tool, if you need more help, there are people on IRC and "rubyonrails-talk":http://groups.google.com/group/rubyonrails-talk that are probably doing the same thing, possibly hitting the same issues. Be sure to blog your own experiences when upgrading so others can benefit from your knowledge!
|
||||
|
||||
More information - "The Path to Rails 3: Approaching the upgrade":http://omgbloglol.com/post/353978923/the-path-to-rails-3-approaching-the-upgrade
|
||||
|
||||
|
@ -113,42 +113,42 @@ Railties was updated to provide a consistent plugin API for the entire Rails fra
|
|||
|
||||
h4. All Rails core components are decoupled
|
||||
|
||||
With the merge of Merb and Rails, one of the big jobs was to remove the tight coupling between Rails core components. This has now been achieved, and all Rails core components are now using the same API that you can use for developing plugins. This means any plugin you make, or any core component replacement (like DataMapper or Sequel) can access all the functionality that the Rails core components have access to and extend and enhance at will.
|
||||
With the merge of Merb and Rails, one of the big jobs was to remove the tight coupling between Rails core components. This has now been achieved, and all Rails core components are now using the same API that you can use for developing plugins. This means any plugin you make, or any core component replacement (like DataMapper or Sequel) can access all the functionality that the Rails core components have access to and extend and enhance at will.
|
||||
|
||||
More information: - "The Great Decoupling":http://yehudakatz.com/2009/07/19/rails-3-the-great-decoupling/
|
||||
|
||||
|
||||
h4. Active Model Abstraction
|
||||
|
||||
Part of decoupling the core components was extracting all ties to Active Record from Action Pack. This has now been completed. All new ORM plugins now just need to implement Active Model interfaces to work seamlessly with Action Pack.
|
||||
Part of decoupling the core components was extracting all ties to Active Record from Action Pack. This has now been completed. All new ORM plugins now just need to implement Active Model interfaces to work seamlessly with Action Pack.
|
||||
|
||||
More information: - "Make Any Ruby Object Feel Like ActiveRecord":http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/
|
||||
|
||||
|
||||
h4. Controller Abstraction
|
||||
|
||||
Another big part of decoupling the core components was creating a base superclass that is separated from the notions of HTTP in order to handle rendering of views etc. This creation of +AbstractController+ allowed +ActionController+ and +ActionMailer+ to be greatly simplified with common code removed from all these libraries and put into Abstract Controller.
|
||||
Another big part of decoupling the core components was creating a base superclass that is separated from the notions of HTTP in order to handle rendering of views etc. This creation of +AbstractController+ allowed +ActionController+ and +ActionMailer+ to be greatly simplified with common code removed from all these libraries and put into Abstract Controller.
|
||||
|
||||
More Information: - "Rails Edge Architecture":http://yehudakatz.com/2009/06/11/rails-edge-architecture/
|
||||
|
||||
|
||||
h4. Arel Integration
|
||||
|
||||
"Arel":http://github.com/brynary/arel (or Active Relation) has been taken on as the underpinnings of Active Record and is now required for Rails. Arel provides an SQL abstraction that simplifies out Active Record and provides the underpinnings for the relation functionality in Active Record.
|
||||
"Arel":http://github.com/brynary/arel (or Active Relation) has been taken on as the underpinnings of Active Record and is now required for Rails. Arel provides an SQL abstraction that simplifies out Active Record and provides the underpinnings for the relation functionality in Active Record.
|
||||
|
||||
More information: - "Why I wrote Arel":http://magicscalingsprinkles.wordpress.com/2010/01/28/why-i-wrote-arel/.
|
||||
|
||||
|
||||
h4. Mail Extraction
|
||||
|
||||
Action Mailer ever since its beginnings has had monkey patches, pre parsers and even delivery and receiver agents, all in addition to having TMail vendored in the source tree. Version 3 changes that with all email message related functionality abstracted out to the "Mail":http://github.com/mikel/mail gem. This again reduces code duplication and helps create definable boundaries between Action Mailer and the email parser.
|
||||
Action Mailer ever since its beginnings has had monkey patches, pre parsers and even delivery and receiver agents, all in addition to having TMail vendored in the source tree. Version 3 changes that with all email message related functionality abstracted out to the "Mail":http://github.com/mikel/mail gem. This again reduces code duplication and helps create definable boundaries between Action Mailer and the email parser.
|
||||
|
||||
More information: - "New Action Mailer API in Rails 3":http://lindsaar.net/2010/1/26/new-actionmailer-api-in-rails-3
|
||||
|
||||
|
||||
h3. Documentation
|
||||
|
||||
The documentation in the Rails tree is being updated with all the API changes, additionally, the "Rails Edge Guides":http://edgeguides.rubyonrails.org/ are being updated one by one to reflect the changes in Rails 3.0. The guides at "guides.rubyonrails.org":http://guides.rubyonrails.org/ however will continue to contain only the stable version of Rails (at this point, version 2.3.5, until 3.0 is released).
|
||||
The documentation in the Rails tree is being updated with all the API changes, additionally, the "Rails Edge Guides":http://edgeguides.rubyonrails.org/ are being updated one by one to reflect the changes in Rails 3.0. The guides at "guides.rubyonrails.org":http://guides.rubyonrails.org/ however will continue to contain only the stable version of Rails (at this point, version 2.3.5, until 3.0 is released).
|
||||
|
||||
More Information: - "Rails Documentation Projects":http://weblog.rubyonrails.org/2009/1/15/rails-documentation-projects.
|
||||
|
||||
|
@ -157,7 +157,7 @@ h3. Internationalization
|
|||
|
||||
A large amount of work has been done with I18n support in Rails 3, including the latest "I18n":http://github.com/svenfuchs/i18n gem supplying many speed improvements.
|
||||
|
||||
* I18n for any object - I18n behavior can be added to any object by including <tt>ActiveModel::Translation</tt> and <tt>ActiveModel::Validations</tt>. There is also an <tt>errors.messages</tt> fallback for translations.
|
||||
* I18n for any object - I18n behavior can be added to any object by including <tt>ActiveModel::Translation</tt> and <tt>ActiveModel::Validations</tt>. There is also an <tt>errors.messages</tt> fallback for translations.
|
||||
* Attributes can have default translations.
|
||||
* Form Submit Tags automatically pull the correct status (Create or Update) depending on the object status, and so pull the correct translation.
|
||||
* Labels with I18n also now work by just passing the attribute name.
|
||||
|
@ -173,7 +173,7 @@ With the decoupling of the main Rails frameworks, Railties got a huge overhaul s
|
|||
* Anything under <tt>Rails.root/app</tt> is now added to the load path, so you can make <tt>app/observers/user_observer.rb</tt> and Rails will load it without any modifications.
|
||||
* Rails 3.0 now provides a <tt>Rails.config</tt> object, which provides a central repository of all sorts of Rails wide configuration options.
|
||||
|
||||
Application generation has received extra flags allowing you to skip the installation of test-unit, Active Record, Prototype and Git. Also a new <tt>--dev</tt> flag has been added which sets the application up with the +Gemfile+ pointing to your Rails checkout (which is determined by the path to the +rails+ binary). See <tt>rails --help</tt> for more info.
|
||||
Application generation has received extra flags allowing you to skip the installation of test-unit, Active Record, Prototype and Git. Also a new <tt>--dev</tt> flag has been added which sets the application up with the +Gemfile+ pointing to your Rails checkout (which is determined by the path to the +rails+ binary). See <tt>rails --help</tt> for more info.
|
||||
|
||||
Railties generators got a huge amount of attention in Rails 3.0, basically:
|
||||
|
||||
|
@ -215,7 +215,7 @@ There have been significant internal and external changes in Action Pack.
|
|||
|
||||
h4. Abstract Controller
|
||||
|
||||
Abstract Controller pulls out the generic parts of Action Controller into a reusable module that any library can use to render templates, render partials, helpers, translations, logging, any part of the request response cycle. This abstraction allowed <tt>ActionMailer::Base</tt> to now just inherit from +AbstractController+ and just wrap the Rails DSL onto the Mail gem.
|
||||
Abstract Controller pulls out the generic parts of Action Controller into a reusable module that any library can use to render templates, render partials, helpers, translations, logging, any part of the request response cycle. This abstraction allowed <tt>ActionMailer::Base</tt> to now just inherit from +AbstractController+ and just wrap the Rails DSL onto the Mail gem.
|
||||
|
||||
It also provided an opportunity to clean up Action Controller, abstracting out what could to simplify the code.
|
||||
|
||||
|
@ -231,7 +231,7 @@ h4. Action Controller
|
|||
* The <tt>session_store</tt> was configured in <tt>ActionController::Base.session</tt>, and that is now moved to <tt>Rails.application.config.session_store</tt>. Defaults are set up in <tt>config/initializers/session_store.rb</tt>.
|
||||
* <tt>cookies.secure</tt> allowing you to set encrypted values in cookies with <tt>cookie.secure[:key] => value</tt>.
|
||||
* <tt>cookies.permanent</tt> allowing you to set permanent values in the cookie hash <tt>cookie.permanent[:key] => value</tt> that raise exceptions on signed values if verification failures.
|
||||
* You can now pass <tt>:notice => 'This is a flash message'</tt> or <tt>:alert => 'Something went wrong'</tt> to the <tt>format</tt> call inside a +respond_to+ block. The <tt>flash[]</tt> hash still works as previously.
|
||||
* You can now pass <tt>:notice => 'This is a flash message'</tt> or <tt>:alert => 'Something went wrong'</tt> to the <tt>format</tt> call inside a +respond_to+ block. The <tt>flash[]</tt> hash still works as previously.
|
||||
* <tt>respond_with</tt> method has now been added to your controllers simplifying the venerable +format+ blocks.
|
||||
* <tt>ActionController::Responder</tt> added allowing you flexibility in how your responses get generated.
|
||||
|
||||
|
@ -298,9 +298,9 @@ h4. Action View
|
|||
|
||||
h5. Unobtrusive JavaScript
|
||||
|
||||
Major re-write was done in the Action View helpers, implementing Unobtrusive JavaScript (UJS) hooks and removing the old inline AJAX commands. This enables Rails to use any compliant UJS driver to implement the UJS hooks in the helpers.
|
||||
Major re-write was done in the Action View helpers, implementing Unobtrusive JavaScript (UJS) hooks and removing the old inline AJAX commands. This enables Rails to use any compliant UJS driver to implement the UJS hooks in the helpers.
|
||||
|
||||
What this means is that all previous <tt>remote_<method></tt> helpers have been removed from Rails core and put into the "Prototype Legacy Helper":http://github.com/rails/prototype_legacy_helper. To get UJS hooks into your HTML, you now pass <tt>:remote => true</tt> instead. For example:
|
||||
What this means is that all previous <tt>remote_<method></tt> helpers have been removed from Rails core and put into the "Prototype Legacy Helper":http://github.com/rails/prototype_legacy_helper. To get UJS hooks into your HTML, you now pass <tt>:remote => true</tt> instead. For example:
|
||||
|
||||
<ruby>
|
||||
form_for @post, :remote => true
|
||||
|
@ -341,12 +341,12 @@ h5. Other Changes
|
|||
|
||||
h3. Active Model
|
||||
|
||||
Active Model is new in Rails 3.0. It provides an abstraction layer for any ORM libraries to use to interact with Rails by implementing an Active Model interface.
|
||||
Active Model is new in Rails 3.0. It provides an abstraction layer for any ORM libraries to use to interact with Rails by implementing an Active Model interface.
|
||||
|
||||
|
||||
h4. ORM Abstraction and Action Pack Interface
|
||||
|
||||
Part of decoupling the core components was extracting all ties to Active Record from Action Pack. This has now been completed. All new ORM plugins now just need to implement Active Model interfaces to work seamlessly with Action Pack.
|
||||
Part of decoupling the core components was extracting all ties to Active Record from Action Pack. This has now been completed. All new ORM plugins now just need to implement Active Model interfaces to work seamlessly with Action Pack.
|
||||
|
||||
More Information: - "Make Any Ruby Object Feel Like ActiveRecord":http://yehudakatz.com/2010/01/10/activemodel-make-any-ruby-object-feel-like-activerecord/
|
||||
|
||||
|
@ -410,12 +410,12 @@ More Information:
|
|||
|
||||
h3. Active Record
|
||||
|
||||
Active Record received a lot of attention in Rails 3.0, including abstraction into Active Model, a full update to the Query interface using Arel, validation updates and many enhancements and fixes. All of the Rails 2.x API will be usable through a compatibility layer that will be supported until version 3.1.
|
||||
Active Record received a lot of attention in Rails 3.0, including abstraction into Active Model, a full update to the Query interface using Arel, validation updates and many enhancements and fixes. All of the Rails 2.x API will be usable through a compatibility layer that will be supported until version 3.1.
|
||||
|
||||
|
||||
h4. Query Interface
|
||||
|
||||
Active Record, through the use of Arel, now returns relations on its core methods. The existing API in Rails 2.3.x is still supported and will not be deprecated until Rails 3.1 and not removed until Rails 3.2, however, the new API provides the following new methods that all return relations allowing them to be chained together:
|
||||
Active Record, through the use of Arel, now returns relations on its core methods. The existing API in Rails 2.3.x is still supported and will not be deprecated until Rails 3.1 and not removed until Rails 3.2, however, the new API provides the following new methods that all return relations allowing them to be chained together:
|
||||
|
||||
* <tt>where</tt> - provides conditions on the relation, what gets returned.
|
||||
* <tt>select</tt> - choose what attributes of the models you wish to have returned from the database.
|
||||
|
@ -502,7 +502,7 @@ Deprecations:
|
|||
|
||||
h3. Active Support
|
||||
|
||||
A large effort was made in Active Support to make it cherry pickable, that is, you no longer have to require the entire Active Support library to get pieces of it. This allows the various core components of Rails to run slimmer.
|
||||
A large effort was made in Active Support to make it cherry pickable, that is, you no longer have to require the entire Active Support library to get pieces of it. This allows the various core components of Rails to run slimmer.
|
||||
|
||||
These are the main changes in Active Support:
|
||||
|
||||
|
@ -559,7 +559,7 @@ The following methods have been removed because they are no longer used in the f
|
|||
|
||||
h3. Action Mailer
|
||||
|
||||
Action Mailer has been given a new API with TMail being replaced out with the new "Mail":http://github.com/mikel/mail as the Email library. Action Mailer itself has been given an almost complete re-write with pretty much every line of code touched. The result is that Action Mailer now simply inherits from Abstract Controller and wraps the Mail gem in a Rails DSL. This reduces the amount of code and duplication of other libraries in Action Mailer considerably.
|
||||
Action Mailer has been given a new API with TMail being replaced out with the new "Mail":http://github.com/mikel/mail as the Email library. Action Mailer itself has been given an almost complete re-write with pretty much every line of code touched. The result is that Action Mailer now simply inherits from Abstract Controller and wraps the Mail gem in a Rails DSL. This reduces the amount of code and duplication of other libraries in Action Mailer considerably.
|
||||
|
||||
* All mailers are now in <tt>app/mailers</tt> by default.
|
||||
* Can now send email using new API with three methods: +attachments+, +headers+ and +mail+.
|
||||
|
@ -589,7 +589,7 @@ More Information:
|
|||
|
||||
h3. Credits
|
||||
|
||||
See the "full list of contributors to Rails":http://contributors.rubyonrails.org/ for the many people who spent many hours making Rails 3. Kudos to all of them.
|
||||
See the "full list of contributors to Rails":http://contributors.rubyonrails.org/ for the many people who spent many hours making Rails 3. Kudos to all of them.
|
||||
|
||||
Rails 3.0 Release Notes were compiled by "Mikel Lindsaar":http://lindsaar.net.
|
||||
|
||||
|
|
|
@ -104,7 +104,7 @@ When you call the +mail+ method now, Action Mailer will detect the two templates
|
|||
|
||||
h5. Wire It Up So That the System Sends the Email When a User Signs Up
|
||||
|
||||
There are several ways to do this, some people create Rails Observers to fire off emails, others do it inside of the User Model. However, in Rails 3, mailers are really just another way to render a view. Instead of rendering a view and sending out the HTTP protocol, they are just sending it out through the Email protocols instead. Due to this, it makes sense to just have your controller tell the mailer to send an email when a user is successfully created.
|
||||
There are several ways to do this, some people create Rails Observers to fire off emails, others do it inside of the User Model. However, in Rails 3, mailers are really just another way to render a view. Instead of rendering a view and sending out the HTTP protocol, they are just sending it out through the Email protocols instead. Due to this, it makes sense to just have your controller tell the mailer to send an email when a user is successfully created.
|
||||
|
||||
Setting this up is painfully simple.
|
||||
|
||||
|
@ -293,7 +293,7 @@ class UserMailer < ActionMailer::Base
|
|||
end
|
||||
</ruby>
|
||||
|
||||
Will render 'another_template.text.erb' and 'another_template.html.erb'. The render command is the same one used inside of Action Controller, so you can use all the same options, such as <tt>:text</tt> etc.
|
||||
Will render 'another_template.text.erb' and 'another_template.html.erb'. The render command is the same one used inside of Action Controller, so you can use all the same options, such as <tt>:text</tt> etc.
|
||||
|
||||
h4. Action Mailer Layouts
|
||||
|
||||
|
@ -363,7 +363,7 @@ h4. Sending Multipart Emails
|
|||
|
||||
Action Mailer will automatically send multipart emails if you have different templates for the same action. So, for our UserMailer example, if you have +welcome_email.text.erb+ and +welcome_email.html.erb+ in +app/views/user_mailer+, Action Mailer will automatically send a multipart email with the HTML and text versions setup as different parts.
|
||||
|
||||
The order of the parts getting inserted is determined by the <tt>:parts_order</tt> inside of the <tt>ActionMailer::Base.default</tt> method. If you want to explicitly alter the order, you can either change the <tt>:parts_order</tt> or explicitly render the parts in a different order:
|
||||
The order of the parts getting inserted is determined by the <tt>:parts_order</tt> inside of the <tt>ActionMailer::Base.default</tt> method. If you want to explicitly alter the order, you can either change the <tt>:parts_order</tt> or explicitly render the parts in a different order:
|
||||
|
||||
<ruby>
|
||||
class UserMailer < ActionMailer::Base
|
||||
|
@ -419,7 +419,7 @@ class UserMailer < ActionMailer::Base
|
|||
)
|
||||
|
||||
if email.has_attachments?
|
||||
for attachment in email.attachments
|
||||
email.attachments.each do |attachment|
|
||||
page.attachments.create({
|
||||
:file => attachment,
|
||||
:description => email.subject
|
||||
|
|
|
@ -615,7 +615,7 @@ atom_feed do |feed|
|
|||
feed.title("Posts Index")
|
||||
feed.updated((@posts.first.created_at))
|
||||
|
||||
for post in @posts
|
||||
@posts.each do |post|
|
||||
feed.entry(post) do |entry|
|
||||
entry.title(post.title)
|
||||
entry.content(post.body, :type => 'html')
|
||||
|
|
|
@ -165,23 +165,23 @@ Each helper accepts an arbitrary number of attribute names, so with a single lin
|
|||
|
||||
All of them accept the +:on+ and +:message+ options, which define when the validation should be run and what message should be added to the +errors+ collection if it fails, respectively. The +:on+ option takes one of the values +:save+ (the default), +:create+ or +:update+. There is a default error message for each one of the validation helpers. These messages are used when the +:message+ option isn't specified. Let's take a look at each one of the available helpers.
|
||||
|
||||
h4. +validates_acceptance_of+
|
||||
h4. +acceptance+
|
||||
|
||||
Validates that a checkbox on the user interface was checked when a form was submitted. This is typically used when the user needs to agree to your application's terms of service, confirm reading some text, or any similar concept. This validation is very specific to web applications and this 'acceptance' does not need to be recorded anywhere in your database (if you don't have a field for it, the helper will just create a virtual attribute).
|
||||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_acceptance_of :terms_of_service
|
||||
validates :terms_of_service, :acceptance => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
The default error message for +validates_acceptance_of+ is "_must be accepted_".
|
||||
The default error message for this helper is "_must be accepted_".
|
||||
|
||||
+validates_acceptance_of+ can receive an +:accept+ option, which determines the value that will be considered acceptance. It defaults to "1", but you can change this.
|
||||
It can receive an +:accept+ option, which determines the value that will be considered acceptance. It defaults to "1" and can be easily changed.
|
||||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_acceptance_of :terms_of_service, :accept => 'yes'
|
||||
validates :terms_of_service, :acceptance => true, :accept => 'yes'
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -202,13 +202,13 @@ CAUTION: Don't use +validates_associated+ on both ends of your associations. The
|
|||
|
||||
The default error message for +validates_associated+ is "_is invalid_". Note that each associated object will contain its own +errors+ collection; errors do not bubble up to the calling model.
|
||||
|
||||
h4. +validates_confirmation_of+
|
||||
h4. +confirmation+
|
||||
|
||||
You should use this helper when you have two text fields that should receive exactly the same content. For example, you may want to confirm an email address or a password. This validation creates a virtual attribute whose name is the name of the field that has to be confirmed with "_confirmation" appended.
|
||||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_confirmation_of :email
|
||||
validates :email, :confirmation => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -219,70 +219,70 @@ In your view template you could use something like
|
|||
<%= text_field :person, :email_confirmation %>
|
||||
</erb>
|
||||
|
||||
This check is performed only if +email_confirmation+ is not +nil+. To require confirmation, make sure to add a presence check for the confirmation attribute (we'll take a look at +validates_presence_of+ later on this guide):
|
||||
This check is performed only if +email_confirmation+ is not +nil+. To require confirmation, make sure to add a presence check for the confirmation attribute (we'll take a look at +presence+ later on this guide):
|
||||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_confirmation_of :email
|
||||
validates_presence_of :email_confirmation
|
||||
validates :email, :confirmation => true
|
||||
validates :email_confirmation, :presence => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
The default error message for +validates_confirmation_of+ is "_doesn't match confirmation_".
|
||||
The default error message for this helper is "_doesn't match confirmation_".
|
||||
|
||||
h4. +validates_exclusion_of+
|
||||
h4. +exclusion+
|
||||
|
||||
This helper validates that the attributes' values are not included in a given set. In fact, this set can be any enumerable object.
|
||||
|
||||
<ruby>
|
||||
class Account < ActiveRecord::Base
|
||||
validates_exclusion_of :subdomain, :in => %w(www us ca jp),
|
||||
:message => "Subdomain %{value} is reserved."
|
||||
validates :subdomain, :exclusion => { :in => %w(www us ca jp),
|
||||
:message => "Subdomain %{value} is reserved." }
|
||||
end
|
||||
</ruby>
|
||||
|
||||
The +validates_exclusion_of+ helper has an option +:in+ that receives the set of values that will not be accepted for the validated attributes. The +:in+ option has an alias called +:within+ that you can use for the same purpose, if you'd like to. This example uses the +:message+ option to show how you can include the attribute's value.
|
||||
The +exclusion+ helper has an option +:in+ that receives the set of values that will not be accepted for the validated attributes. The +:in+ option has an alias called +:within+ that you can use for the same purpose, if you'd like to. This example uses the +:message+ option to show how you can include the attribute's value.
|
||||
|
||||
The default error message for +validates_exclusion_of+ is "_is reserved_".
|
||||
The default error message is "_is reserved_".
|
||||
|
||||
h4. +validates_format_of+
|
||||
h4. +format+
|
||||
|
||||
This helper validates the attributes' values by testing whether they match a given regular expression, which is specified using the +:with+ option.
|
||||
|
||||
<ruby>
|
||||
class Product < ActiveRecord::Base
|
||||
validates_format_of :legacy_code, :with => /\A[a-zA-Z]+\z/,
|
||||
:message => "Only letters allowed"
|
||||
validates :legacy_code, :format => { :with => /\A[a-zA-Z]+\z/,
|
||||
:message => "Only letters allowed" }
|
||||
end
|
||||
</ruby>
|
||||
|
||||
The default error message for +validates_format_of+ is "_is invalid_".
|
||||
The default error message is "_is invalid_".
|
||||
|
||||
h4. +validates_inclusion_of+
|
||||
h4. +inclusion+
|
||||
|
||||
This helper validates that the attributes' values are included in a given set. In fact, this set can be any enumerable object.
|
||||
|
||||
<ruby>
|
||||
class Coffee < ActiveRecord::Base
|
||||
validates_inclusion_of :size, :in => %w(small medium large),
|
||||
:message => "%{value} is not a valid size"
|
||||
validates :size, :inclusion => { :in => %w(small medium large),
|
||||
:message => "%{value} is not a valid size" }
|
||||
end
|
||||
</ruby>
|
||||
|
||||
The +validates_inclusion_of+ helper has an option +:in+ that receives the set of values that will be accepted. The +:in+ option has an alias called +:within+ that you can use for the same purpose, if you'd like to. The previous example uses the +:message+ option to show how you can include the attribute's value.
|
||||
The +inclusion+ helper has an option +:in+ that receives the set of values that will be accepted. The +:in+ option has an alias called +:within+ that you can use for the same purpose, if you'd like to. The previous example uses the +:message+ option to show how you can include the attribute's value.
|
||||
|
||||
The default error message for +validates_inclusion_of+ is "_is not included in the list_".
|
||||
The default error message for this helper is "_is not included in the list_".
|
||||
|
||||
h4. +validates_length_of+
|
||||
h4. +length+
|
||||
|
||||
This helper validates the length of the attributes' values. It provides a variety of options, so you can specify length constraints in different ways:
|
||||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_length_of :name, :minimum => 2
|
||||
validates_length_of :bio, :maximum => 500
|
||||
validates_length_of :password, :in => 6..20
|
||||
validates_length_of :registration_number, :is => 6
|
||||
validates :name, :length => { :minimum => 2 }
|
||||
validates :bio, :length => { :maximum => 500 }
|
||||
validates :password, :length => { :in => 6..20 }
|
||||
validates :registration_number, :length => { :is => 6 }
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -297,8 +297,8 @@ The default error messages depend on the type of length validation being perform
|
|||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_length_of :bio, :maximum => 1000,
|
||||
:too_long => "%{count} characters is the maximum allowed"
|
||||
validates :bio, :length => { :maximum => 1000,
|
||||
:too_long => "%{count} characters is the maximum allowed" }
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -306,20 +306,21 @@ This helper counts characters by default, but you can split the value in a diffe
|
|||
|
||||
<ruby>
|
||||
class Essay < ActiveRecord::Base
|
||||
validates_length_of :content,
|
||||
validates :content, :length => {
|
||||
:minimum => 300,
|
||||
:maximum => 400,
|
||||
:tokenizer => lambda { |str| str.scan(/\w+/) },
|
||||
:too_short => "must have at least %{count} words",
|
||||
:too_long => "must have at most %{count} words"
|
||||
}
|
||||
end
|
||||
</ruby>
|
||||
|
||||
Note that the default error messages are plural (e.g., "is too short (minimum is %{count} characters)"). For this reason, when +:minimum+ is 1 you should provide a personalized message or use +validates_presence_of+ instead. When +:in+ or +:within+ have a lower limit of 1, you should either provide a personalized message or call +validates_presence_of+ prior to +validates_length_of+.
|
||||
Note that the default error messages are plural (e.g., "is too short (minimum is %{count} characters)"). For this reason, when +:minimum+ is 1 you should provide a personalized message or use +validates_presence_of+ instead. When +:in+ or +:within+ have a lower limit of 1, you should either provide a personalized message or call +presence+ prior to +length+.
|
||||
|
||||
The +validates_size_of+ helper is an alias for +validates_length_of+.
|
||||
The +size+ helper is an alias for +length+.
|
||||
|
||||
h4. +validates_numericality_of+
|
||||
h4. +numericality+
|
||||
|
||||
This helper validates that your attributes have only numeric values. By default, it will match an optional sign followed by an integral or floating point number. To specify that only integral numbers are allowed set +:only_integer+ to true.
|
||||
|
||||
|
@ -335,12 +336,12 @@ WARNING. Note that the regular expression above allows a trailing newline charac
|
|||
|
||||
<ruby>
|
||||
class Player < ActiveRecord::Base
|
||||
validates_numericality_of :points
|
||||
validates_numericality_of :games_played, :only_integer => true
|
||||
validates :points, :numericality => true
|
||||
validates :games_played, :numericality => true, :only_integer => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
Besides +:only_integer+, the +validates_numericality_of+ helper also accepts the following options to add constraints to acceptable values:
|
||||
Besides +:only_integer+, this helper also accepts the following options to add constraints to acceptable values:
|
||||
|
||||
* +:greater_than+ - Specifies the value must be greater than the supplied value. The default error message for this option is "_must be greater than %{count}_".
|
||||
* +:greater_than_or_equal_to+ - Specifies the value must be greater than or equal to the supplied value. The default error message for this option is "_must be greater than or equal to %{count}_".
|
||||
|
@ -350,9 +351,9 @@ Besides +:only_integer+, the +validates_numericality_of+ helper also accepts the
|
|||
* +:odd+ - Specifies the value must be an odd number if set to true. The default error message for this option is "_must be odd_".
|
||||
* +:even+ - Specifies the value must be an even number if set to true. The default error message for this option is "_must be even_".
|
||||
|
||||
The default error message for +validates_numericality_of+ is "_is not a number_".
|
||||
The default error message is "_is not a number_".
|
||||
|
||||
h4. +validates_presence_of+
|
||||
h4. +presence+
|
||||
|
||||
This helper validates that the specified attributes are not empty. It uses the +blank?+ method to check if the value is either +nil+ or a blank string, that is, a string that is either empty or consists of whitespace.
|
||||
|
||||
|
@ -367,21 +368,21 @@ If you want to be sure that an association is present, you'll need to test wheth
|
|||
<ruby>
|
||||
class LineItem < ActiveRecord::Base
|
||||
belongs_to :order
|
||||
validates_presence_of :order_id
|
||||
validates :order_id, :presence => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
Since +false.blank?+ is true, if you want to validate the presence of a boolean field you should use +validates_inclusion_of :field_name, :in => [true, false]+.
|
||||
Since +false.blank?+ is true, if you want to validate the presence of a boolean field you should use <tt>validates :field_name, :inclusion => { :in => [true, false] }</tt>.
|
||||
|
||||
The default error message for +validates_presence_of+ is "_can't be empty_".
|
||||
The default error message is "_can't be empty_".
|
||||
|
||||
h4. +validates_uniqueness_of+
|
||||
h4. +uniqueness+
|
||||
|
||||
This helper validates that the attribute's value is unique right before the object gets saved. It does not create a uniqueness constraint in the database, so it may happen that two different database connections create two records with the same value for a column that you intend to be unique. To avoid that, you must create a unique index in your database.
|
||||
|
||||
<ruby>
|
||||
class Account < ActiveRecord::Base
|
||||
validates_uniqueness_of :email
|
||||
validates :email, :uniqueness => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -391,7 +392,7 @@ There is a +:scope+ option that you can use to specify other attributes that are
|
|||
|
||||
<ruby>
|
||||
class Holiday < ActiveRecord::Base
|
||||
validates_uniqueness_of :name, :scope => :year,
|
||||
validates :name, :uniqueness => true, :scope => :year,
|
||||
:message => "should happen once per year"
|
||||
end
|
||||
</ruby>
|
||||
|
@ -400,13 +401,13 @@ There is also a +:case_sensitive+ option that you can use to define whether the
|
|||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_uniqueness_of :name, :case_sensitive => false
|
||||
validates :name, :uniqueness => true, :case_sensitive => false
|
||||
end
|
||||
</ruby>
|
||||
|
||||
WARNING. Note that some databases are configured to perform case-insensitive searches anyway.
|
||||
|
||||
The default error message for +validates_uniqueness_of+ is "_has already been taken_".
|
||||
The default error message is "_has already been taken_".
|
||||
|
||||
h4. +validates_with+
|
||||
|
||||
|
@ -470,8 +471,8 @@ The +:allow_nil+ option skips the validation when the value being validated is +
|
|||
|
||||
<ruby>
|
||||
class Coffee < ActiveRecord::Base
|
||||
validates_inclusion_of :size, :in => %w(small medium large),
|
||||
:message => "%{value} is not a valid size", :allow_nil => true
|
||||
validates :size, :inclusion => { :in => %w(small medium large),
|
||||
:message => "%{value} is not a valid size" }, :allow_nil => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -483,10 +484,10 @@ The +:allow_blank+ option is similar to the +:allow_nil+ option. This option wil
|
|||
|
||||
<ruby>
|
||||
class Topic < ActiveRecord::Base
|
||||
validates_length_of :title, :is => 5, :allow_blank => true
|
||||
validates :title, :length => { :is => 5 }, :allow_blank => true
|
||||
end
|
||||
|
||||
Topic.create("title" => "").valid? # => true
|
||||
Topic.create("title" => "").valid? # => true
|
||||
Topic.create("title" => nil).valid? # => true
|
||||
</ruby>
|
||||
|
||||
|
@ -503,10 +504,10 @@ The +:on+ option lets you specify when the validation should happen. The default
|
|||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
# it will be possible to update email with a duplicated value
|
||||
validates_uniqueness_of :email, :on => :create
|
||||
validates :email, :uniqueness => true, :on => :create
|
||||
|
||||
# it will be possible to create the record with a non-numerical age
|
||||
validates_numericality_of :age, :on => :update
|
||||
validates :age, :numericality => true, :on => :update
|
||||
|
||||
# the default (validates on both create and update)
|
||||
validates :name, :presence => true, :on => :save
|
||||
|
@ -523,7 +524,7 @@ You can associate the +:if+ and +:unless+ options with a symbol corresponding to
|
|||
|
||||
<ruby>
|
||||
class Order < ActiveRecord::Base
|
||||
validates_presence_of :card_number, :if => :paid_with_card?
|
||||
validates :card_number, :presence => true, :if => :paid_with_card?
|
||||
|
||||
def paid_with_card?
|
||||
payment_type == "card"
|
||||
|
@ -537,7 +538,7 @@ You can also use a string that will be evaluated using +eval+ and needs to conta
|
|||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates_presence_of :surname, :if => "name.nil?"
|
||||
validates :surname, :presence => true, :if => "name.nil?"
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -547,7 +548,7 @@ Finally, it's possible to associate +:if+ and +:unless+ with a +Proc+ object whi
|
|||
|
||||
<ruby>
|
||||
class Account < ActiveRecord::Base
|
||||
validates_confirmation_of :password,
|
||||
validates :password, :confirmation => true,
|
||||
:unless => Proc.new { |a| a.password.blank? }
|
||||
end
|
||||
</ruby>
|
||||
|
@ -559,8 +560,8 @@ Sometimes it is useful to have multiple validations use one condition, it can be
|
|||
<ruby>
|
||||
class User < ActiveRecord::Base
|
||||
with_options :if => :is_admin? do |admin|
|
||||
admin.validates_length_of :password, :minimum => 10
|
||||
admin.validates_presence_of :email
|
||||
admin.validates :password, :length => { :minimum => 10 }
|
||||
admin.validates :email, :presence => true
|
||||
end
|
||||
end
|
||||
</ruby>
|
||||
|
@ -597,7 +598,7 @@ You can even create your own validation helpers and reuse them in several differ
|
|||
<ruby>
|
||||
ActiveRecord::Base.class_eval do
|
||||
def self.validates_as_choice(attr_name, n, options={})
|
||||
validates_inclusion_of attr_name, {:in => 1..n}.merge(options)
|
||||
validates attr_name, :inclusion => { {:in => 1..n}.merge(options) }
|
||||
end
|
||||
end
|
||||
</ruby>
|
||||
|
@ -622,8 +623,7 @@ Returns an OrderedHash with all errors. Each key is the attribute name and the v
|
|||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates :name, :presence => true
|
||||
validates_length_of :name, :minimum => 3
|
||||
validates :name, :presence => true, :length => { :minimum => 3 }
|
||||
end
|
||||
|
||||
person = Person.new
|
||||
|
@ -642,8 +642,7 @@ h4(#working_with_validation_errors-errors-2). +errors[]+
|
|||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates :name, :presence => true
|
||||
validates_length_of :name, :minimum => 3
|
||||
validates :name, :presence => true, :length => { :minimum => 3 }
|
||||
end
|
||||
|
||||
person = Person.new(:name => "John Doe")
|
||||
|
@ -718,8 +717,7 @@ The +clear+ method is used when you intentionally want to clear all the messages
|
|||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates :name, :presence => true
|
||||
validates_length_of :name, :minimum => 3
|
||||
validates :name, :presence => true, :length => { :minimum => 3 }
|
||||
end
|
||||
|
||||
person = Person.new
|
||||
|
@ -742,9 +740,7 @@ The +size+ method returns the total number of error messages for the object.
|
|||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
validates :name, :presence => true
|
||||
validates_length_of :name, :minimum => 3
|
||||
validates_presence_of :email
|
||||
validates :name, :presence => true, :length => { :minimum => 3 }
|
||||
end
|
||||
|
||||
person = Person.new
|
||||
|
@ -765,13 +761,14 @@ h4. Installing as a plugin
|
|||
$ rails plugin install git://github.com/joelmoss/dynamic_form.git
|
||||
</shell>
|
||||
|
||||
h4 Installing as a Gem
|
||||
Add this line on your Gemfile:
|
||||
h4. Installing as a Gem
|
||||
|
||||
Add this line in your Gemfile:
|
||||
<ruby>
|
||||
gem "dynamic_form"
|
||||
</ruby>
|
||||
|
||||
Now you will have access to these two methods in your view templates:
|
||||
Now you will have access to these two methods in your view templates.
|
||||
|
||||
h4. +error_messages+ and +error_messages_for+
|
||||
|
||||
|
@ -779,8 +776,8 @@ When creating a form with the +form_for+ helper, you can use the +error_messages
|
|||
|
||||
<ruby>
|
||||
class Product < ActiveRecord::Base
|
||||
validates_presence_of :description, :value
|
||||
validates_numericality_of :value, :allow_nil => true
|
||||
validates :description, :value, :presence => true
|
||||
validates :value, :numericality => true, :allow_nil => true
|
||||
end
|
||||
</ruby>
|
||||
|
||||
|
@ -878,7 +875,7 @@ In order to use the available callbacks, you need to register them. You can do t
|
|||
|
||||
<ruby>
|
||||
class User < ActiveRecord::Base
|
||||
validates_presence_of :login, :email
|
||||
validates :login, :email, :presence => true
|
||||
|
||||
before_validation :ensure_login_has_a_value
|
||||
|
||||
|
@ -895,7 +892,7 @@ The macro-style class methods can also receive a block. Consider using this styl
|
|||
|
||||
<ruby>
|
||||
class User < ActiveRecord::Base
|
||||
validates_presence_of :login, :email
|
||||
validates :login, :email, :presence => true
|
||||
|
||||
before_create do |user|
|
||||
user.name = user.login.capitalize if user.name.blank?
|
||||
|
|
|
@ -436,20 +436,6 @@ end
|
|||
|
||||
NOTE: Defined in +active_support/core_ext/kernel/reporting.rb+.
|
||||
|
||||
h4. +require_library_or_gem+
|
||||
|
||||
The convenience method +require_library_or_gem+ tries to load its argument with a regular +require+ first. If it fails loads +rubygems+ and tries again.
|
||||
|
||||
If the first attempt is a failure and +rubygems+ can't be loaded the method raises +LoadError+. A +LoadError+ is also raised if +rubygems+ is available but the argument is not loadable as a gem.
|
||||
|
||||
For example, that's the way the MySQL adapter loads the MySQL library:
|
||||
|
||||
<ruby>
|
||||
require_library_or_gem('mysql')
|
||||
</ruby>
|
||||
|
||||
NOTE: Defined in +active_support/core_ext/kernel/requires.rb+.
|
||||
|
||||
h4. +in?+
|
||||
|
||||
The predicate +in?+ tests if an object is included in another object. An +ArgumentError+ exception will be raised if the argument passed does not respond to +include?+.
|
||||
|
|
29
railties/guides/source/asset_pipeline.textile
Normal file
29
railties/guides/source/asset_pipeline.textile
Normal file
|
@ -0,0 +1,29 @@
|
|||
h2. Asset Pipeline
|
||||
|
||||
This guide will cover the ideology of the asset pipeline introduced in Rails 3.1.
|
||||
By referring to this guide you will be able to:
|
||||
|
||||
* Properly organize your application assets
|
||||
* Understand the benefits of the asset pipline
|
||||
* Adding a preproccessor to the pipeline
|
||||
* Package assets with your plugin
|
||||
|
||||
endprologue.
|
||||
|
||||
h3. What Is The Asset Pipeline?
|
||||
|
||||
h4. Why Should I Use it?
|
||||
|
||||
h3. How to Use the Asset Pipeline
|
||||
|
||||
h4. Asset Organization
|
||||
|
||||
h4. Default Files Loaded
|
||||
|
||||
h4. Directives
|
||||
|
||||
h4. Stacking Preproccessors
|
||||
|
||||
h3. Packaging Assets with Your Plugin
|
||||
|
||||
h3. More on Sprockets
|
|
@ -414,7 +414,7 @@ Rails has 5 initialization events which can be hooked into (listed in order that
|
|||
|
||||
* +to_prepare+: Run after the initializers are ran for all Railties (including the application itself), but before eager loading and the middleware stack is built.
|
||||
|
||||
* +before_eager_load+: This is run directly before eager loading occurs, which is the default behaviour for the _production_ environment and not for the +development+ enviroment.
|
||||
* +before_eager_load+: This is run directly before eager loading occurs, which is the default behaviour for the _production_ environment and not for the +development+ environment.
|
||||
|
||||
* +after_initialize+: Run directly after the initialization of the application, but before the application initializers are run.
|
||||
|
||||
|
|
|
@ -712,7 +712,7 @@ You might want to render a form with a set of edit fields for each of a person's
|
|||
<erb>
|
||||
<%= form_for @person do |person_form| %>
|
||||
<%= person_form.text_field :name %>
|
||||
<% for address in @person.addresses %>
|
||||
<% @person.addresses.each do |address| %>
|
||||
<%= person_form.fields_for address, :index => address do |address_form|%>
|
||||
<%= address_form.text_field :city %>
|
||||
<% end %>
|
||||
|
|
|
@ -544,7 +544,7 @@ This view iterates over the contents of the +@posts+ array to display content an
|
|||
* +link_to+ builds a hyperlink to a particular destination
|
||||
* +edit_post_path+ and +new_post_path+ are helpers that Rails provides as part of RESTful routing. You'll see a variety of these helpers for the different actions that the controller includes.
|
||||
|
||||
NOTE. In previous versions of Rails, you had to use +<%=h post.name %>+ so that any HTML would be escaped before being inserted into the page. In Rails 3.0, this is now the default. To get unescaped HTML, you now use +<%= raw post.name %>+.
|
||||
NOTE. In previous versions of Rails, you had to use +<%=h post.name %>+ so that any HTML would be escaped before being inserted into the page. In Rails 3.0, this is now the default. To get unescaped HTML, you now use +<%= raw post.name %>+.
|
||||
|
||||
TIP: For more details on the rendering process, see "Layouts and Rendering in Rails":layouts_and_rendering.html.
|
||||
|
||||
|
|
|
@ -25,33 +25,36 @@ endprologue.
|
|||
|
||||
h3. Setup
|
||||
|
||||
h4. Generating the Plugin Skeleton
|
||||
Before you continue, take a moment to decide if your new plugin will be potentially shared across different Rails applications.
|
||||
|
||||
Rails currently ships with a generator to generate a plugin within a Rails application. Help text is available that will explain
|
||||
how this generator works.
|
||||
* If your plugin is specific to your application, your new plugin will be a _vendored plugin_.
|
||||
* If you think your plugin may be used across applications, build it as a _gemified plugin_.
|
||||
|
||||
h4. Either generate a vendored plugin...
|
||||
|
||||
Use the +rails generate plugin+ command in your Rails root directory
|
||||
to create a new plugin that will live in the +vendor/plugins+
|
||||
directory. See usage and options by asking for help:
|
||||
|
||||
<shell>
|
||||
$ rails generate plugin --help
|
||||
$ rails generate plugin new --help
|
||||
</shell>
|
||||
|
||||
This generator places the plugin into the vendor/plugins directory.
|
||||
h4. Or generate a gemified plugin.
|
||||
|
||||
Vendored plugins are useful for quickly prototyping your plugin but current thinking in the Rails community is shifting towards
|
||||
packaging plugins as gems, especially with the inclusion of Bundler as the Rails dependency manager.
|
||||
Packaging a plugin as a gem may be overkill for any plugins that will not be shared across projects but doing so from the start makes it easier to share the plugin going forward without adding too much additional overhead during development.
|
||||
Writing your Rails plugin as a gem, rather than as a vendored plugin,
|
||||
lets you share your plugin across different rails applications using
|
||||
RubyGems and Bundler.
|
||||
|
||||
Rails 3.1 will ship with a plugin generator that will default to setting up a plugin
|
||||
as a gem. This tutorial will begin to bridge that gap by demonstrating how to create a gem based plugin using the
|
||||
"Enginex gem":http://www.github.com/josevalim/enginex.
|
||||
Rails 3.1 ships with a +rails plugin new+ command which creates a
|
||||
skeleton for developing any kind of Rails extension with the ability
|
||||
to run integration tests using a dummy Rails application. See usage
|
||||
and options by asking for help:
|
||||
|
||||
<shell>
|
||||
$ gem install enginex
|
||||
$ enginex --help
|
||||
$ enginex yaffle
|
||||
$ rails plugin --help
|
||||
</shell>
|
||||
|
||||
This command will create a new directory named "yaffle" within the current directory.
|
||||
|
||||
h3. Testing your newly generated plugin
|
||||
|
||||
You can navigate to the directory that contains the plugin, run the +bundle install+ command
|
||||
|
@ -319,7 +322,7 @@ When you run +rake+ you should see the tests all pass:
|
|||
|
||||
h4. Add an Instance Method
|
||||
|
||||
This plugin will add a method named 'squawk' to any Active Record objects that call 'acts_as_yaffle'. The 'squawk'
|
||||
This plugin will add a method named 'squawk' to any Active Record objects that call 'acts_as_yaffle'. The 'squawk'
|
||||
method will simply set the value of one of the fields in the database.
|
||||
|
||||
To start out, write a failing test that shows the behavior you'd like:
|
||||
|
@ -387,9 +390,7 @@ Run +rake+ one final time and you should see:
|
|||
7 tests, 7 assertions, 0 failures, 0 errors, 0 skips
|
||||
</shell>
|
||||
|
||||
NOTE: The use of +write_attribute+ to write to the field in model is just one example of how a plugin can
|
||||
interact with the model, and will not always be the right method to use. For example, you could also
|
||||
use +send("#{self.class.yaffle_text_field}=", string.to_squawk)+.
|
||||
NOTE: The use of +write_attribute+ to write to the field in model is just one example of how a plugin can interact with the model, and will not always be the right method to use. For example, you could also use <tt>send("#{self.class.yaffle_text_field}=", string.to_squawk)</tt>.
|
||||
|
||||
h3. Generators
|
||||
|
||||
|
|
|
@ -880,7 +880,7 @@ h3. Changelog
|
|||
|
||||
* April 10, 2010: Updated guide to remove outdated and superfluous information, and to provide information about new features, by "Yehuda Katz":http://www.yehudakatz.com
|
||||
* April 2, 2010: Updated guide to match new Routing DSL in Rails 3, by "Rizwan Reza":http://www.rizwanreza.com/
|
||||
* Febuary 1, 2010: Modifies the routing documentation to match new routing DSL in Rails 3, by Prem Sichanugrist
|
||||
* February 1, 2010: Modifies the routing documentation to match new routing DSL in Rails 3, by Prem Sichanugrist
|
||||
* October 4, 2008: Added additional detail on specifying verbs for resource member/collection routes, by "Mike Gunderloy":credits.html#mgunderloy
|
||||
* September 23, 2008: Added section on namespaced controllers and routing, by "Mike Gunderloy":credits.html#mgunderloy
|
||||
* September 10, 2008: initial version by "Mike Gunderloy":credits.html#mgunderloy
|
||||
|
|
|
@ -62,10 +62,10 @@ To force process of all the guides, pass +ALL=1+.
|
|||
|
||||
It is also recommended that you work with +WARNINGS=1+. This detects duplicate IDs and warns about broken internal links.
|
||||
|
||||
If you want to generate guides in languages other than English, you can keep them in a separate directory under +source+ (eg. <tt>source/es</tt>) and use the +LANGUAGE+ environment variable:
|
||||
If you want to generate guides in languages other than English, you can keep them in a separate directory under +source+ (eg. <tt>source/es</tt>) and use the +GUIDES_LANGUAGE+ environment variable:
|
||||
|
||||
<plain>
|
||||
rake generate_guides LANGUAGE=es
|
||||
rake generate_guides GUIDES_LANGUAGE=es
|
||||
</plain>
|
||||
|
||||
h3. HTML Validation
|
||||
|
|
|
@ -386,7 +386,7 @@ params[:user] # => {:name => “ow3ned”, :admin => true}
|
|||
|
||||
So if you create a new user using mass-assignment, it may be too easy to become an administrator.
|
||||
|
||||
Note that this vulnerability is not restricted to database columns. Any setter method, unless explicitly protected, is accessible via the <tt>attributes=</tt> method. In fact, this vulnerability is extended even further with the introduction of nested mass assignment (and nested object forms) in Rails 2.3+. The +accepts_nested_attributes_for+ declaration provides us the ability to extend mass assignment to model associations (+has_many+, +has_one+, +has_and_belongs_to_many+). For example:
|
||||
Note that this vulnerability is not restricted to database columns. Any setter method, unless explicitly protected, is accessible via the <tt>attributes=</tt> method. In fact, this vulnerability is extended even further with the introduction of nested mass assignment (and nested object forms) in Rails 2.3+. The +accepts_nested_attributes_for+ declaration provides us the ability to extend mass assignment to model associations (+has_many+, +has_one+, +has_and_belongs_to_many+). For example:
|
||||
|
||||
<ruby>
|
||||
class Person < ActiveRecord::Base
|
||||
|
@ -469,7 +469,7 @@ A more paranoid technique to protect your whole project would be to enforce that
|
|||
config.active_record.whitelist_attributes = true
|
||||
</ruby>
|
||||
|
||||
This will create an empty whitelist of attributes available for mass-assignment for all models in your app. As such, your models will need to explicitly whitelist or blacklist accessible parameters by using an +attr_accessible+ or +attr_protected+ declaration. This technique is best applied at the start of a new project. However, for an existing project with a thorough set of functional tests, it should be straightforward and relatively quick to use this application config option; run your tests, and expose each attribute (via +attr_accessible+ or +attr_protected+) as dictated by your failing tests.
|
||||
This will create an empty whitelist of attributes available for mass-assignment for all models in your app. As such, your models will need to explicitly whitelist or blacklist accessible parameters by using an +attr_accessible+ or +attr_protected+ declaration. This technique is best applied at the start of a new project. However, for an existing project with a thorough set of functional tests, it should be straightforward and relatively quick to use this application config option; run your tests, and expose each attribute (via +attr_accessible+ or +attr_protected+) as dictated by your failing tests.
|
||||
|
||||
h3. User Management
|
||||
|
||||
|
@ -540,7 +540,7 @@ Most bots are really dumb, they crawl the web and put their spam into every form
|
|||
Here are some ideas how to hide honeypot fields by JavaScript and/or CSS:
|
||||
|
||||
* position the fields off of the visible area of the page
|
||||
* make the elements very small or colour them the same as the background of the page
|
||||
* make the elements very small or color them the same as the background of the page
|
||||
* leave the fields displayed, but tell humans to leave them blank
|
||||
|
||||
The most simple negative CAPTCHA is one hidden honeypot field. On the server side, you will check the value of the field: If it contains any text, it must be a bot. Then, you can either ignore the post or return a positive result, but not saving the post to the database. This way the bot will be satisfied and moves on. You can do this with annoying users, too.
|
||||
|
@ -567,7 +567,7 @@ h4. Good Passwords
|
|||
|
||||
-- _Do you find it hard to remember all your passwords? Don't write them down, but use the initial letters of each word in an easy to remember sentence._
|
||||
|
||||
Bruce Schneier, a security technologist, "has analysed":http://www.schneier.com/blog/archives/2006/12/realworld_passw.html 34,000 real-world user names and passwords from the MySpace phishing attack mentioned <a href="#examples-from-the-underground">below</a>. It turns out that most of the passwords are quite easy to crack. The 20 most common passwords are:
|
||||
Bruce Schneier, a security technologist, "has analyzed":http://www.schneier.com/blog/archives/2006/12/realworld_passw.html 34,000 real-world user names and passwords from the MySpace phishing attack mentioned <a href="#examples-from-the-underground">below</a>. It turns out that most of the passwords are quite easy to crack. The 20 most common passwords are:
|
||||
|
||||
password1, abc123, myspace1, password, blink182, qwerty1, ****you, 123abc, baseball1, football1, 123456, soccer, monkey1, liverpool1, princess1, jordan23, slipknot1, superman1, iloveyou1, and monkey.
|
||||
|
||||
|
@ -885,7 +885,7 @@ The "moz-binding":http://www.securiteam.com/securitynews/5LP051FHPE.html CSS pro
|
|||
|
||||
h5(#css-injection-countermeasures). Countermeasures
|
||||
|
||||
This example, again, showed that a blacklist filter is never complete. However, as custom CSS in web applications is a quite rare feature, I am not aware of a whitelist CSS filter. _(highlight)If you want to allow custom colours or images, you can allow the user to choose them and build the CSS in the web application_. Use Rails' +sanitize()+ method as a model for a whitelist CSS filter, if you really need one.
|
||||
This example, again, showed that a blacklist filter is never complete. However, as custom CSS in web applications is a quite rare feature, I am not aware of a whitelist CSS filter. _(highlight)If you want to allow custom colors or images, you can allow the user to choose them and build the CSS in the web application_. Use Rails' +sanitize()+ method as a model for a whitelist CSS filter, if you really need one.
|
||||
|
||||
h4. Textile Injection
|
||||
|
||||
|
|
|
@ -180,7 +180,7 @@ module Rails
|
|||
# <tt>my_engine:install:assets</tt>
|
||||
#
|
||||
# Engine name is set by default based on class name. For <tt>MyEngine::Engine</tt> it will be
|
||||
# <tt>my_engine_engine</tt>. You can change it manually it manually using the <tt>engine_name</tt> method:
|
||||
# <tt>my_engine_engine</tt>. You can change it manually using the <tt>engine_name</tt> method:
|
||||
#
|
||||
# module MyEngine
|
||||
# class Engine < Rails::Engine
|
||||
|
@ -296,7 +296,7 @@ module Rails
|
|||
# helper MyEngine::SharedEngineHelper
|
||||
# end
|
||||
#
|
||||
# If you want to include all of the engine's helpers, you can use #helpers method on egine's
|
||||
# If you want to include all of the engine's helpers, you can use #helpers method on an engine's
|
||||
# instance:
|
||||
#
|
||||
# class ApplicationController < ActionController::Base
|
||||
|
@ -305,7 +305,7 @@ module Rails
|
|||
#
|
||||
# It will include all of the helpers from engine's directory. Take into account that this does
|
||||
# not include helpers defined in controllers with helper_method or other similar solutions,
|
||||
# only helpers defined in helpers directory will be included.
|
||||
# only helpers defined in the helpers directory will be included.
|
||||
#
|
||||
# == Migrations & seed data
|
||||
#
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
# Settings specified here will take precedence over those in config/application.rb
|
||||
|
||||
# In the development environment your application's code is reloaded on
|
||||
# every request. This slows down response time but is perfect for development
|
||||
# every request. This slows down response time but is perfect for development
|
||||
# since you don't have to restart the web server when you make code changes.
|
||||
config.cache_classes = false
|
||||
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
# Settings specified here will take precedence over those in config/application.rb
|
||||
|
||||
# The test environment is used exclusively to run your application's
|
||||
# test suite. You never need to work with it otherwise. Remember that
|
||||
# test suite. You never need to work with it otherwise. Remember that
|
||||
# your test database is "scratch space" for the test suite and is wiped
|
||||
# and recreated between test runs. Don't rely on the data there!
|
||||
# and recreated between test runs. Don't rely on the data there!
|
||||
config.cache_classes = true
|
||||
|
||||
# Configure static asset server for tests with Cache-Control for performance
|
||||
|
|
Loading…
Reference in a new issue