From 3395ebe32097f6c711a3f3f1f44b67b3f969107e Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 16:49:33 -0500 Subject: add note about AR#include_root_in_json default in Upgrading Rails guide [ci skip] --- guides/source/upgrading_ruby_on_rails.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/guides/source/upgrading_ruby_on_rails.md b/guides/source/upgrading_ruby_on_rails.md index 1eb8ff2f59..d6c425a356 100644 --- a/guides/source/upgrading_ruby_on_rails.md +++ b/guides/source/upgrading_ruby_on_rails.md @@ -51,7 +51,21 @@ Rails 4.0 has changed `serialized_attributes` and `attr_readonly` to class metho ### Active Model -Rails 4.0 has changed how errors attach with the `ActiveModel::Validations::ConfirmationValidator`. Now when confirmation validations fail the error will be attached to `:#{attribute}_confirmation` instead of `attribute`. +Rails 4.0 has changed how errors attach with the `ActiveModel::Validations::ConfirmationValidator`. +Now when confirmation validations fail the error will be attached to +`:#{attribute}_confirmation` instead of `attribute`. + +Rails 4.0 has changed `ActiveModel::Serializers::JSON.include_root_in_json` default +value to `false`. Now, Active Model Serializers and Active Record objects have the +same default behaviour. This means that you can comment or remove the following option +in the `config/initializers/wrap_parameters.rb` file: + +```ruby +# Disable root element in JSON by default. +# ActiveSupport.on_load(:active_record) do +# self.include_root_in_json = false +# end +``` ### Action Pack -- cgit v1.2.3 From fa9424695644c12efeb8413511eea4f55b3bb22c Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 20:10:57 -0500 Subject: fix typos in AC::StrongParameters documentation [ci skip] --- actionpack/lib/action_controller/metal/strong_parameters.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/actionpack/lib/action_controller/metal/strong_parameters.rb b/actionpack/lib/action_controller/metal/strong_parameters.rb index 55cc62a15e..b12d280721 100644 --- a/actionpack/lib/action_controller/metal/strong_parameters.rb +++ b/actionpack/lib/action_controller/metal/strong_parameters.rb @@ -290,9 +290,9 @@ module ActionController # end # # # This will pass with flying colors as long as there's a person key in the - # # parameters, otherwise it'll raise a ActionController::MissingParameter + # # parameters, otherwise it'll raise an ActionController::MissingParameter # # exception, which will get caught by ActionController::Base and turned - # # into that 400 Bad Request reply. + # # into a 400 Bad Request reply. # def update # redirect_to current_account.people.find(params[:id]).tap { |person| # person.update_attributes!(person_params) -- cgit v1.2.3 From 08035482858a56963c7694bc7b92308f59272b28 Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 20:49:56 -0500 Subject: update AR::Associations::CollectionProxy#loaded? documentation [ci skip] --- activerecord/lib/active_record/associations/collection_proxy.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/associations/collection_proxy.rb b/activerecord/lib/active_record/associations/collection_proxy.rb index c113957faa..cd3cb1fba0 100644 --- a/activerecord/lib/active_record/associations/collection_proxy.rb +++ b/activerecord/lib/active_record/associations/collection_proxy.rb @@ -42,6 +42,11 @@ module ActiveRecord @association.load_target end + # Returns +true+ if the association has been loaded, otherwise +false+. + # + # person.pets.loaded? # => false + # person.pets + # person.pets.loaded? # => true def loaded? @association.loaded? end @@ -889,7 +894,7 @@ module ActiveRecord end # Returns a new array of objects from the collection. If the collection - # hasn't been loaded, it fetches the records from the database. + # hasn't been loaded, it fetches the records from the database. # # class Person < ActiveRecord::Base # has_many :pets -- cgit v1.2.3 From e216b00a5ef6038ba227faf3207891c403fb8d1c Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 22:17:32 -0500 Subject: fix AR::Associations::CollectionProxy#delete broken documentation [ci skip] --- .../active_record/associations/collection_proxy.rb | 25 ++-------------------- 1 file changed, 2 insertions(+), 23 deletions(-) diff --git a/activerecord/lib/active_record/associations/collection_proxy.rb b/activerecord/lib/active_record/associations/collection_proxy.rb index cd3cb1fba0..e73f940334 100644 --- a/activerecord/lib/active_record/associations/collection_proxy.rb +++ b/activerecord/lib/active_record/associations/collection_proxy.rb @@ -51,7 +51,6 @@ module ActiveRecord @association.loaded? end - ## # Works in two ways. # # *First:* Specify a subset of fields to be selected from the result set. @@ -109,9 +108,8 @@ module ActiveRecord @association.select(select, &block) end - ## # Finds an object in the collection responding to the +id+. Uses the same - # rules as +ActiveRecord::Base.find+. Returns +ActiveRecord::RecordNotFound++ + # rules as ActiveRecord::Base.find. Returns ActiveRecord::RecordNotFound # error if the object can not be found. # # class Person < ActiveRecord::Base @@ -140,7 +138,6 @@ module ActiveRecord @association.find(*args, &block) end - ## # Returns the first record, or the first +n+ records, from the collection. # If the collection is empty, the first form returns +nil+, and the second # form returns an empty array. @@ -171,7 +168,6 @@ module ActiveRecord @association.first(*args) end - ## # Returns the last record, or the last +n+ records, from the collection. # If the collection is empty, the first form returns +nil+, and the second # form returns an empty array. @@ -202,7 +198,6 @@ module ActiveRecord @association.last(*args) end - ## # Returns a new object of the collection type that has been instantiated # with +attributes+ and linked to this object, but have not yet been saved. # You can pass an array of attributes hashes, this will return an array @@ -231,7 +226,6 @@ module ActiveRecord @association.build(attributes, &block) end - ## # Returns a new object of the collection type that has been instantiated with # attributes, linked to this object and that has already been saved (if it # passes the validations). @@ -262,7 +256,6 @@ module ActiveRecord @association.create(attributes, &block) end - ## # Like +create+, except that if the record is invalid, raises an exception. # # class Person @@ -279,7 +272,6 @@ module ActiveRecord @association.create!(attributes, &block) end - ## # Add one or more records to the collection by setting their foreign keys # to the association's primary key. Since << flattens its argument list and # inserts each record, +push+ and +concat+ behave identically. Returns +self+ @@ -308,7 +300,6 @@ module ActiveRecord @association.concat(*records) end - ## # Replace this collection with +other_array+. This will perform a diff # and delete/add only records that have changed. # @@ -335,7 +326,6 @@ module ActiveRecord @association.replace(other_array) end - ## # Deletes all the records from the collection. For +has_many+ associations, # the deletion is done according to the strategy specified by the :dependent # option. Returns an array with the deleted records. @@ -428,7 +418,6 @@ module ActiveRecord @association.delete_all end - ## # Deletes the records of the collection directly from the database. # This will _always_ remove the records ignoring the +:dependent+ # option. @@ -455,7 +444,6 @@ module ActiveRecord @association.destroy_all end - ## # Deletes the +records+ supplied and removes them from the collection. For # +has_many+ associations, the deletion is done according to the strategy # specified by the :dependent option. Returns an array with the @@ -519,7 +507,7 @@ module ActiveRecord # Pet.find(1, 3) # # => ActiveRecord::RecordNotFound: Couldn't find all Pets with IDs (1, 3) # - # If it is set to :delete_all, all the +records+ are deleted + # If it is set to :delete_all, all the +records+ are deleted # *without* calling their +destroy+ method. # # class Person < ActiveRecord::Base @@ -574,7 +562,6 @@ module ActiveRecord @association.delete(*records) end - ## # Destroys the +records+ supplied and removes them from the collection. # This method will _always_ remove record from the database ignoring # the +:dependent+ option. Returns an array with the removed records. @@ -647,7 +634,6 @@ module ActiveRecord @association.destroy(*records) end - ## # Specifies whether the records should be unique or not. # # class Person < ActiveRecord::Base @@ -666,7 +652,6 @@ module ActiveRecord @association.uniq end - ## # Count all records using SQL. # # class Person < ActiveRecord::Base @@ -684,7 +669,6 @@ module ActiveRecord @association.count(column_name, options) end - ## # Returns the size of the collection. If the collection hasn't been loaded, # it executes a SELECT COUNT(*) query. # @@ -709,7 +693,6 @@ module ActiveRecord @association.size end - ## # Returns the size of the collection calling +size+ on the target. # If the collection has been already loaded, +length+ and +size+ are # equivalent. @@ -733,7 +716,6 @@ module ActiveRecord @association.length end - ## # Returns +true+ if the collection is empty. # # class Person < ActiveRecord::Base @@ -751,7 +733,6 @@ module ActiveRecord @association.empty? end - ## # Returns +true+ if the collection is not empty. # # class Person < ActiveRecord::Base @@ -785,7 +766,6 @@ module ActiveRecord @association.any?(&block) end - ## # Returns true if the collection has more than one record. # Equivalent to collection.size > 1. # @@ -824,7 +804,6 @@ module ActiveRecord @association.many?(&block) end - ## # Returns +true+ if the given object is present in the collection. # # class Person < ActiveRecord::Base -- cgit v1.2.3 From 7e538e81541f4c756cf465d7240b85cfe290676a Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 22:31:02 -0500 Subject: fix AR::AttributeMethods::Dirty :nodoc: [ci skip] --- activerecord/lib/active_record/attribute_methods/dirty.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/activerecord/lib/active_record/attribute_methods/dirty.rb b/activerecord/lib/active_record/attribute_methods/dirty.rb index 60e5b0e2bb..ba32f1ec51 100644 --- a/activerecord/lib/active_record/attribute_methods/dirty.rb +++ b/activerecord/lib/active_record/attribute_methods/dirty.rb @@ -7,7 +7,7 @@ module ActiveRecord end module AttributeMethods - module Dirty + module Dirty # :nodoc: extend ActiveSupport::Concern include ActiveModel::Dirty @@ -21,7 +21,7 @@ module ActiveRecord end # Attempts to +save+ the record and clears changed attributes if successful. - def save(*) #:nodoc: + def save(*) if status = super @previously_changed = changes @changed_attributes.clear @@ -30,7 +30,7 @@ module ActiveRecord end # Attempts to save! the record and clears changed attributes if successful. - def save!(*) #:nodoc: + def save!(*) super.tap do @previously_changed = changes @changed_attributes.clear @@ -38,7 +38,7 @@ module ActiveRecord end # reload the record and clears changed attributes. - def reload(*) #:nodoc: + def reload(*) super.tap do @previously_changed.clear @changed_attributes.clear -- cgit v1.2.3 From fe78e1dad6af88a08715abcad0e6e4e2d5c9b262 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Sat, 22 Sep 2012 06:31:14 +0300 Subject: Better docs for overriding inheretance column --- activerecord/lib/active_record/model.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/activerecord/lib/active_record/model.rb b/activerecord/lib/active_record/model.rb index 16d9d404e3..f059840f4d 100644 --- a/activerecord/lib/active_record/model.rb +++ b/activerecord/lib/active_record/model.rb @@ -108,12 +108,9 @@ module ActiveRecord # The default inheritance column name is +type+, which means it's a # reserved word inside Active Record. To be able to use single-table # inheritance with another column name, or to use the column +type+ in - # your own model for something else, you can override this method to - # return a different name: + # your own model for something else, you can set +inheritance_column+: # - # def self.inheritance_column - # 'zoink' - # end + # self.inheritance_column = 'zoink' def inheritance_column 'type' end -- cgit v1.2.3 From c57064a8ab22906cc3f5b4cc6845ac5e1e1a384d Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 22:47:08 -0500 Subject: update AR/attribute_methods documentation [ci skip] --- .../active_record/attribute_methods/primary_key.rb | 26 +++++++++++++--------- .../lib/active_record/attribute_methods/read.rb | 12 +++++----- .../attribute_methods/serialization.rb | 19 +++++++++------- .../lib/active_record/attribute_methods/write.rb | 5 +++-- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/activerecord/lib/active_record/attribute_methods/primary_key.rb b/activerecord/lib/active_record/attribute_methods/primary_key.rb index aa6704d5c9..0857b02c8e 100644 --- a/activerecord/lib/active_record/attribute_methods/primary_key.rb +++ b/activerecord/lib/active_record/attribute_methods/primary_key.rb @@ -5,28 +5,29 @@ module ActiveRecord module PrimaryKey extend ActiveSupport::Concern - # Returns this record's primary key value wrapped in an Array if one is available + # Returns this record's primary key value wrapped in an Array if one is + # available. def to_key key = self.id [key] if key end - # Returns the primary key value + # Returns the primary key value. def id read_attribute(self.class.primary_key) end - # Sets the primary key value + # Sets the primary key value. def id=(value) write_attribute(self.class.primary_key, value) if self.class.primary_key end - # Queries the primary key value + # Queries the primary key value. def id? query_attribute(self.class.primary_key) end - # Returns the primary key value before type cast + # Returns the primary key value before type cast. def id_before_type_cast read_attribute_before_type_cast(self.class.primary_key) end @@ -52,14 +53,16 @@ module ActiveRecord super && !ID_ATTRIBUTE_METHODS.include?(method_name) end - # Defines the primary key field -- can be overridden in subclasses. Overwriting will negate any effect of the - # primary_key_prefix_type setting, though. + # Defines the primary key field -- can be overridden in subclasses. + # Overwriting will negate any effect of the +primary_key_prefix_type+ + # setting, though. def primary_key @primary_key = reset_primary_key unless defined? @primary_key @primary_key end - # Returns a quoted version of the primary key name, used to construct SQL statements. + # Returns a quoted version of the primary key name, used to construct + # SQL statements. def quoted_primary_key @quoted_primary_key ||= connection.quote_column_name(primary_key) end @@ -92,16 +95,17 @@ module ActiveRecord # Sets the name of the primary key column. # # class Project < ActiveRecord::Base - # self.primary_key = "sysid" + # self.primary_key = 'sysid' # end # - # You can also define the primary_key method yourself: + # You can also define the +primary_key+ method yourself: # # class Project < ActiveRecord::Base # def self.primary_key - # "foo_" + super + # 'foo_' + super # end # end + # # Project.primary_key # => "foo_id" def primary_key=(value) @primary_key = value && value.to_s diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb index 1a4cb25dd7..6213b5dcd5 100644 --- a/activerecord/lib/active_record/attribute_methods/read.rb +++ b/activerecord/lib/active_record/attribute_methods/read.rb @@ -14,9 +14,10 @@ module ActiveRecord end module ClassMethods - # +cache_attributes+ allows you to declare which converted attribute values should - # be cached. Usually caching only pays off for attributes with expensive conversion - # methods, like time related columns (e.g. +created_at+, +updated_at+). + # +cache_attributes+ allows you to declare which converted attribute + # values should be cached. Usually caching only pays off for attributes + # with expensive conversion methods, like time related columns (e.g. + # +created_at+, +updated_at+). def cache_attributes(*attribute_names) cached_attributes.merge attribute_names.map { |attr| attr.to_s } end @@ -65,8 +66,9 @@ module ActiveRecord ActiveRecord::Model.attribute_types_cached_by_default = ATTRIBUTE_TYPES_CACHED_BY_DEFAULT - # Returns the value of the attribute identified by attr_name after it has been typecast (for example, - # "2004-12-12" in a data column is cast to a date object, like Date.new(2004, 12, 12)). + # Returns the value of the attribute identified by attr_name after + # it has been typecast (for example, "2004-12-12" in a data column is cast + # to a date object, like Date.new(2004, 12, 12)). def read_attribute(attr_name) return unless attr_name name_sym = attr_name.to_sym diff --git a/activerecord/lib/active_record/attribute_methods/serialization.rb b/activerecord/lib/active_record/attribute_methods/serialization.rb index bdda5bc009..d2cfcbbaf8 100644 --- a/activerecord/lib/active_record/attribute_methods/serialization.rb +++ b/activerecord/lib/active_record/attribute_methods/serialization.rb @@ -4,17 +4,19 @@ module ActiveRecord extend ActiveSupport::Concern included do - # Returns a hash of all the attributes that have been specified for serialization as - # keys and their class restriction as values. + # Returns a hash of all the attributes that have been specified for + # serialization as keys and their class restriction as values. class_attribute :serialized_attributes, instance_accessor: false self.serialized_attributes = {} end module ClassMethods - # If you have an attribute that needs to be saved to the database as an object, and retrieved as the same object, - # then specify the name of that attribute using this method and it will be handled automatically. - # The serialization is done through YAML. If +class_name+ is specified, the serialized object must be of that - # class on retrieval or SerializationTypeMismatch will be raised. + # If you have an attribute that needs to be saved to the database as an + # object, and retrieved as the same object, then specify the name of that + # attribute using this method and it will be handled automatically. The + # serialization is done through YAML. If +class_name+ is specified, the + # serialized object must be of that class on retrieval or + # SerializationTypeMismatch will be raised. # # ==== Parameters # @@ -22,7 +24,8 @@ module ActiveRecord # * +class_name+ - Optional, class name that the object type should be equal to. # # ==== Example - # # Serialize a preferences attribute + # + # # Serialize a preferences attribute. # class User < ActiveRecord::Base # serialize :preferences # end @@ -60,7 +63,7 @@ module ActiveRecord end end - class Attribute < Struct.new(:coder, :value, :state) + class Attribute < Struct.new(:coder, :value, :state) # :nodoc: def unserialized_value state == :serialized ? unserialize : value end diff --git a/activerecord/lib/active_record/attribute_methods/write.rb b/activerecord/lib/active_record/attribute_methods/write.rb index 5a39cb0125..6eb9e25fd9 100644 --- a/activerecord/lib/active_record/attribute_methods/write.rb +++ b/activerecord/lib/active_record/attribute_methods/write.rb @@ -20,8 +20,9 @@ module ActiveRecord end end - # Updates the attribute identified by attr_name with the specified +value+. Empty strings - # for fixnum and float columns are turned into +nil+. + # Updates the attribute identified by attr_name with the + # specified +value+. Empty strings for fixnum and float columns are + # turned into +nil+. def write_attribute(attr_name, value) attr_name = attr_name.to_s attr_name = self.class.primary_key if attr_name == 'id' && self.class.primary_key -- cgit v1.2.3 From 64298519a560cdbdbc80fa50704b211589d37960 Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 22:48:33 -0500 Subject: fix AR::Coders::YAMLColumn nodoc [ci skip] --- activerecord/lib/active_record/coders/yaml_column.rb | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/activerecord/lib/active_record/coders/yaml_column.rb b/activerecord/lib/active_record/coders/yaml_column.rb index f17e7158de..f6cdc67b4d 100644 --- a/activerecord/lib/active_record/coders/yaml_column.rb +++ b/activerecord/lib/active_record/coders/yaml_column.rb @@ -1,9 +1,8 @@ require 'yaml' module ActiveRecord - # :stopdoc: - module Coders - class YAMLColumn + module Coders # :nodoc: + class YAMLColumn # :nodoc: RESCUE_ERRORS = [ ArgumentError, Psych::SyntaxError ] attr_accessor :object_class @@ -41,5 +40,4 @@ module ActiveRecord end end end - # :startdoc end -- cgit v1.2.3 From 0eea22bdea4df3ec89ea65157a6a0e85cb048bca Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 22:51:04 -0500 Subject: add :nodoc: directive to AR::Fixtures::File [ci skip] --- activerecord/lib/active_record/fixtures/file.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/fixtures/file.rb b/activerecord/lib/active_record/fixtures/file.rb index a9cabf5a7b..0f6ab3e396 100644 --- a/activerecord/lib/active_record/fixtures/file.rb +++ b/activerecord/lib/active_record/fixtures/file.rb @@ -3,7 +3,7 @@ require 'yaml' module ActiveRecord class Fixtures - class File + class File # :nodoc: include Enumerable ## -- cgit v1.2.3 From 6dec7535fd26b8abea0211313ef2936d28ed1637 Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 23:25:52 -0500 Subject: update AR::Scoping documentation [ci skip] --- activerecord/lib/active_record/scoping/default.rb | 55 ++++++----- activerecord/lib/active_record/scoping/named.rb | 113 +++++++++------------- 2 files changed, 77 insertions(+), 91 deletions(-) diff --git a/activerecord/lib/active_record/scoping/default.rb b/activerecord/lib/active_record/scoping/default.rb index a2a85d4b96..6835d0e01b 100644 --- a/activerecord/lib/active_record/scoping/default.rb +++ b/activerecord/lib/active_record/scoping/default.rb @@ -5,17 +5,17 @@ module ActiveRecord extend ActiveSupport::Concern included do - # Stores the default scope for the class + # Stores the default scope for the class. class_attribute :default_scopes, instance_writer: false self.default_scopes = [] end module ClassMethods - # Returns a scope for the model without the default_scope. + # Returns a scope for the model without the +default_scope+. # # class Post < ActiveRecord::Base # def self.default_scope - # where :published => true + # where published: true # end # end # @@ -23,16 +23,16 @@ module ActiveRecord # Post.unscoped.all # Fires "SELECT * FROM posts" # # This method also accepts a block. All queries inside the block will - # not use the default_scope: + # not use the +default_scope+: # # Post.unscoped { # Post.limit(10) # Fires "SELECT * FROM posts LIMIT 10" # } # # It is recommended that you use the block form of unscoped because - # chaining unscoped with scope does not work. Assuming that - # published is a scope, the following two statements - # are equal: the default_scope is applied on both. + # chaining unscoped with +scope+ does not work. Assuming that + # +published+ is a +scope+, the following two statements + # are equal: the +default_scope+ is applied on both. # # Post.unscoped.published # Post.published @@ -50,35 +50,37 @@ module ActiveRecord # the model. # # class Article < ActiveRecord::Base - # default_scope { where(:published => true) } + # default_scope { where(published: true) } # end # # Article.all # => SELECT * FROM articles WHERE published = true # - # The default_scope is also applied while creating/building a record. It is not - # applied while updating a record. + # The +default_scope+ is also applied while creating/building a record. + # It is not applied while updating a record. # # Article.new.published # => true # Article.create.published # => true # - # (You can also pass any object which responds to call to the default_scope - # macro, and it will be called when building the default scope.) + # (You can also pass any object which responds to +call+ to the + # +default_scope+ macro, and it will be called when building the + # default scope.) # - # If you use multiple default_scope declarations in your model then they will - # be merged together: + # If you use multiple +default_scope+ declarations in your model then + # they will be merged together: # # class Article < ActiveRecord::Base - # default_scope { where(:published => true) } - # default_scope { where(:rating => 'G') } + # default_scope { where(published: true) } + # default_scope { where(rating: 'G') } # end # # Article.all # => SELECT * FROM articles WHERE published = true AND rating = 'G' # - # This is also the case with inheritance and module includes where the parent or module - # defines a default_scope and the child or including class defines a second one. + # This is also the case with inheritance and module includes where the + # parent or module defines a +default_scope+ and the child or including + # class defines a second one. # - # If you need to do more complex things with a default scope, you can alternatively - # define it as a class method: + # If you need to do more complex things with a default scope, you can + # alternatively define it as a class method: # # class Article < ActiveRecord::Base # def self.default_scope @@ -100,7 +102,7 @@ module ActiveRecord self.default_scopes = default_scopes + [scope] end - def build_default_scope #:nodoc: + def build_default_scope # :nodoc: if !Base.is_a?(method(:default_scope).owner) # The user has defined their own default scope method, so call that evaluate_default_scope { default_scope } @@ -117,17 +119,18 @@ module ActiveRecord end end - def ignore_default_scope? #:nodoc: + def ignore_default_scope? # :nodoc: Thread.current["#{self}_ignore_default_scope"] end - def ignore_default_scope=(ignore) #:nodoc: + def ignore_default_scope=(ignore) # :nodoc: Thread.current["#{self}_ignore_default_scope"] = ignore end - # The ignore_default_scope flag is used to prevent an infinite recursion situation where - # a default scope references a scope which has a default scope which references a scope... - def evaluate_default_scope + # The ignore_default_scope flag is used to prevent an infinite recursion + # situation where a default scope references a scope which has a default + # scope which references a scope... + def evaluate_default_scope # :nodoc: return if ignore_default_scope? begin diff --git a/activerecord/lib/active_record/scoping/named.rb b/activerecord/lib/active_record/scoping/named.rb index 75f31229b5..fb5f5b5be0 100644 --- a/activerecord/lib/active_record/scoping/named.rb +++ b/activerecord/lib/active_record/scoping/named.rb @@ -3,7 +3,7 @@ require 'active_support/core_ext/hash/except' require 'active_support/core_ext/kernel/singleton_class' module ActiveRecord - # = Active Record Named \Scopes + # = Active Record \Named \Scopes module Scoping module Named extend ActiveSupport::Concern @@ -16,11 +16,11 @@ module ActiveRecord # posts.each {|p| puts p.name } # Fires "select * from posts" and loads post objects # # fruits = Fruit.all - # fruits = fruits.where(:color => 'red') if options[:red_only] + # fruits = fruits.where(color: 'red') if options[:red_only] # fruits = fruits.limit(10) if limited? # - # You can define a \scope that applies to all finders using - # ActiveRecord::Base.default_scope. + # You can define a scope that applies to all finders using + # ActiveRecord::Base.default_scope. def all if current_scope current_scope.clone @@ -31,7 +31,6 @@ module ActiveRecord end end - ## # Collects attributes from scopes that should be applied when creating # an AR instance for the particular class this is called on. def scope_attributes # :nodoc: @@ -44,86 +43,70 @@ module ActiveRecord end end - ## # Are there default attributes associated with this scope? def scope_attributes? # :nodoc: current_scope || default_scopes.any? end - # Adds a class method for retrieving and querying objects. A \scope represents a narrowing of a database query, - # such as where(:color => :red).select('shirts.*').includes(:washing_instructions). + # Adds a class method for retrieving and querying objects. A \scope + # represents a narrowing of a database query, such as + # where(color: :red).select('shirts.*').includes(:washing_instructions). # # class Shirt < ActiveRecord::Base - # scope :red, where(:color => 'red') - # scope :dry_clean_only, joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true) + # scope :red, -> { where(color: 'red') } + # scope :dry_clean_only, -> { joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true) } # end # - # The above calls to scope define class methods Shirt.red and Shirt.dry_clean_only. Shirt.red, - # in effect, represents the query Shirt.where(:color => 'red'). + # The above calls to +scope+ define class methods Shirt.red and + # Shirt.dry_clean_only. Shirt.red, in effect, + # represents the query Shirt.where(color: 'red'). # - # Note that this is simply 'syntactic sugar' for defining an actual class method: + # You should always pass a callable object to the scopes defined + # with +scope+. This ensures that the scope is re-evaluated each + # time it is called. + # + # Note that this is simply 'syntactic sugar' for defining an actual + # class method: # # class Shirt < ActiveRecord::Base # def self.red - # where(:color => 'red') + # where(color: 'red') # end # end # - # Unlike Shirt.find(...), however, the object returned by Shirt.red is not an Array; it - # resembles the association object constructed by a has_many declaration. For instance, - # you can invoke Shirt.red.first, Shirt.red.count, Shirt.red.where(:size => 'small'). - # Also, just as with the association objects, named \scopes act like an Array, implementing Enumerable; - # Shirt.red.each(&block), Shirt.red.first, and Shirt.red.inject(memo, &block) - # all behave as if Shirt.red really was an Array. - # - # These named \scopes are composable. For instance, Shirt.red.dry_clean_only will produce - # all shirts that are both red and dry clean only. - # Nested finds and calculations also work with these compositions: Shirt.red.dry_clean_only.count - # returns the number of garments for which these criteria obtain. Similarly with - # Shirt.red.dry_clean_only.average(:thread_count). - # - # All \scopes are available as class methods on the ActiveRecord::Base descendant upon which - # the \scopes were defined. But they are also available to has_many associations. If, + # Unlike Shirt.find(...), however, the object returned by + # Shirt.red is not an Array; it resembles the association object + # constructed by a +has_many+ declaration. For instance, you can invoke + # Shirt.red.first, Shirt.red.count, + # Shirt.red.where(size: 'small'). Also, just as with the + # association objects, named \scopes act like an Array, implementing + # Enumerable; Shirt.red.each(&block), Shirt.red.first, + # and Shirt.red.inject(memo, &block) all behave as if + # Shirt.red really was an Array. + # + # These named \scopes are composable. For instance, + # Shirt.red.dry_clean_only will produce all shirts that are + # both red and dry clean only. Nested finds and calculations also work + # with these compositions: Shirt.red.dry_clean_only.count + # returns the number of garments for which these criteria obtain. + # Similarly with Shirt.red.dry_clean_only.average(:thread_count). + # + # All scopes are available as class methods on the ActiveRecord::Base + # descendant upon which the \scopes were defined. But they are also + # available to +has_many+ associations. If, # # class Person < ActiveRecord::Base # has_many :shirts # end # - # then elton.shirts.red.dry_clean_only will return all of Elton's red, dry clean - # only shirts. - # - # Named \scopes can also be procedural: - # - # class Shirt < ActiveRecord::Base - # scope :colored, lambda { |color| where(:color => color) } - # end - # - # In this example, Shirt.colored('puce') finds all puce shirts. - # - # On Ruby 1.9 you can use the 'stabby lambda' syntax: - # - # scope :colored, ->(color) { where(:color => color) } - # - # Note that scopes defined with \scope will be evaluated when they are defined, rather than - # when they are used. For example, the following would be incorrect: - # - # class Post < ActiveRecord::Base - # scope :recent, where('published_at >= ?', Time.current - 1.week) - # end - # - # The example above would be 'frozen' to the Time.current value when the Post - # class was defined, and so the resultant SQL query would always be the same. The correct - # way to do this would be via a lambda, which will re-evaluate the scope each time - # it is called: - # - # class Post < ActiveRecord::Base - # scope :recent, lambda { where('published_at >= ?', Time.current - 1.week) } - # end + # then elton.shirts.red.dry_clean_only will return all of + # Elton's red, dry clean only shirts. # - # Named \scopes can also have extensions, just as with has_many declarations: + # \Named scopes can also have extensions, just as with +has_many+ + # declarations: # # class Shirt < ActiveRecord::Base - # scope :red, where(:color => 'red') do + # scope :red, -> { where(color: 'red') } do # def dom_id # 'red_shirts' # end @@ -133,18 +116,18 @@ module ActiveRecord # Scopes can also be used while creating/building a record. # # class Article < ActiveRecord::Base - # scope :published, where(:published => true) + # scope :published, -> { where(published: true) } # end # # Article.published.new.published # => true # Article.published.create.published # => true # - # Class methods on your model are automatically available + # \Class methods on your model are automatically available # on scopes. Assuming the following setup: # # class Article < ActiveRecord::Base - # scope :published, where(:published => true) - # scope :featured, where(:featured => true) + # scope :published, -> { where(published: true) } + # scope :featured, -> { where(featured: true) } # # def self.latest_article # order('published_at desc').first -- cgit v1.2.3 From e3fa8410a0902a1945ce3ed10c893be0488ffbdc Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 23:27:40 -0500 Subject: remove AC::Parameters reference [ci skip] --- actionpack/lib/action_controller/metal/strong_parameters.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actionpack/lib/action_controller/metal/strong_parameters.rb b/actionpack/lib/action_controller/metal/strong_parameters.rb index b12d280721..b02cb15f93 100644 --- a/actionpack/lib/action_controller/metal/strong_parameters.rb +++ b/actionpack/lib/action_controller/metal/strong_parameters.rb @@ -269,7 +269,7 @@ module ActionController end end - # == Strong Parameters + # == Strong \Parameters # # It provides an interface for protecting attributes from end-user # assignment. This makes Action Controller parameters forbidden -- cgit v1.2.3 From b21012bc3911d53eef6fc3bc3222c8e762664671 Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Fri, 21 Sep 2012 23:38:18 -0500 Subject: nodoc AR::Railtie [ci skip] --- activerecord/lib/active_record/railtie.rb | 4 ++-- activerecord/lib/active_record/railties/controller_runtime.rb | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/activerecord/lib/active_record/railtie.rb b/activerecord/lib/active_record/railtie.rb index a9f80ccd5f..e293f641ee 100644 --- a/activerecord/lib/active_record/railtie.rb +++ b/activerecord/lib/active_record/railtie.rb @@ -10,7 +10,7 @@ require "action_controller/railtie" module ActiveRecord # = Active Record Railtie - class Railtie < Rails::Railtie + class Railtie < Rails::Railtie # :nodoc: config.active_record = ActiveSupport::OrderedOptions.new config.app_generators.orm :active_record, :migration => true, @@ -76,7 +76,7 @@ module ActiveRecord config.after_initialize do |app| ActiveSupport.on_load(:active_record) do filename = File.join(app.config.paths["db"].first, "schema_cache.dump") - + if File.file?(filename) cache = Marshal.load File.binread filename if cache.version == ActiveRecord::Migrator.current_version diff --git a/activerecord/lib/active_record/railties/controller_runtime.rb b/activerecord/lib/active_record/railties/controller_runtime.rb index c5db9b4625..7695eacbff 100644 --- a/activerecord/lib/active_record/railties/controller_runtime.rb +++ b/activerecord/lib/active_record/railties/controller_runtime.rb @@ -2,7 +2,7 @@ require 'active_support/core_ext/module/attr_internal' require 'active_record/log_subscriber' module ActiveRecord - module Railties + module Railties # :nodoc: module ControllerRuntime #:nodoc: extend ActiveSupport::Concern @@ -37,7 +37,7 @@ module ActiveRecord end end - module ClassMethods + module ClassMethods # :nodoc: def log_process_action(payload) messages, db_runtime = super, payload[:db_runtime] messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime -- cgit v1.2.3 From d13cd2a7a9d766f450e9a8a7e01f5df54b3dc7b0 Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Sat, 22 Sep 2012 18:26:00 -0500 Subject: update AR::Validations documentation [ci skip] --- activerecord/lib/active_record/core.rb | 2 +- activerecord/lib/active_record/validations.rb | 23 +++++++++++----------- .../lib/active_record/validations/associated.rb | 2 +- .../lib/active_record/validations/presence.rb | 17 ++++++++-------- .../lib/active_record/validations/uniqueness.rb | 12 +++++------ 5 files changed, 28 insertions(+), 28 deletions(-) diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index f97c363871..c01a472d76 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -1,4 +1,4 @@ -require 'active_support/core_ext/hash/indifferent_access' + require 'active_support/core_ext/hash/indifferent_access' require 'active_support/core_ext/object/duplicable' require 'thread' diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb index ed561bfb3c..019290725d 100644 --- a/activerecord/lib/active_record/validations.rb +++ b/activerecord/lib/active_record/validations.rb @@ -10,8 +10,8 @@ module ActiveRecord # puts invalid.record.errors # end class RecordInvalid < ActiveRecordError - attr_reader :record - def initialize(record) + attr_reader :record # :nodoc: + def initialize(record) # :nodoc: @record = record errors = @record.errors.full_messages.join(", ") super(I18n.t(:"#{@record.class.i18n_scope}.errors.messages.record_invalid", :errors => errors, :default => :"errors.messages.record_invalid")) @@ -44,23 +44,24 @@ module ActiveRecord end end - # The validation process on save can be skipped by passing :validate => false. The regular Base#save method is - # replaced with this when the validations module is mixed in, which it is by default. + # The validation process on save can be skipped by passing validate: false. + # The regular Base#save method is replaced with this when the validations + # module is mixed in, which it is by default. def save(options={}) perform_validations(options) ? super : false end - # Attempts to save the record just like Base#save but will raise a +RecordInvalid+ exception instead of returning false - # if the record is not valid. + # Attempts to save the record just like Base#save but will raise a +RecordInvalid+ + # exception instead of returning +false+ if the record is not valid. def save!(options={}) perform_validations(options) ? super : raise(RecordInvalid.new(self)) end - # Runs all the validations within the specified context. Returns true if no errors are found, - # false otherwise. + # Runs all the validations within the specified context. Returns +true+ if + # no errors are found, +false+ otherwise. # - # If the argument is false (default is +nil+), the context is set to :create if - # new_record? is true, and to :update if it is not. + # If the argument is +false+ (default is +nil+), the context is set to :create if + # new_record? is +true+, and to :update if it is not. # # Validations with no :on option will run no matter the context. Validations with # some :on option will only run in the specified context. @@ -72,7 +73,7 @@ module ActiveRecord protected - def perform_validations(options={}) + def perform_validations(options={}) # :nodoc: perform_validation = options[:validate] != false perform_validation ? valid?(options[:context]) : true end diff --git a/activerecord/lib/active_record/validations/associated.rb b/activerecord/lib/active_record/validations/associated.rb index 1fa6629980..7f1972ccf9 100644 --- a/activerecord/lib/active_record/validations/associated.rb +++ b/activerecord/lib/active_record/validations/associated.rb @@ -38,7 +38,7 @@ module ActiveRecord # proc or string should return or evaluate to a +true+ or +false+ value. # * :unless - Specifies a method, proc or string to call to # determine if the validation should not occur (e.g. unless: :skip_validation, - # or unless: => Proc.new { |user| user.signup_step <= 2 }). The + # or unless: Proc.new { |user| user.signup_step <= 2 }). The # method, proc or string should return or evaluate to a +true+ or +false+ # value. def validates_associated(*attr_names) diff --git a/activerecord/lib/active_record/validations/presence.rb b/activerecord/lib/active_record/validations/presence.rb index 056527b512..81a3521d24 100644 --- a/activerecord/lib/active_record/validations/presence.rb +++ b/activerecord/lib/active_record/validations/presence.rb @@ -1,6 +1,6 @@ module ActiveRecord module Validations - class PresenceValidator < ActiveModel::Validations::PresenceValidator + class PresenceValidator < ActiveModel::Validations::PresenceValidator # :nodoc: def validate(record) super attributes.each do |attribute| @@ -29,7 +29,7 @@ module ActiveRecord # # If you want to validate the presence of a boolean field (where the real values # are true and false), you will want to use - # validates_inclusion_of :field_name, :in => [true, false]. + # validates_inclusion_of :field_name, in: [true, false]. # # This is due to the way Object#blank? handles boolean values: # false.blank? # => true. @@ -46,16 +46,15 @@ module ActiveRecord # validation contexts by default (+nil+), other options are :create # and :update. # * :if - Specifies a method, proc or string to call to determine if - # the validation should occur (e.g. :if => :allow_validation, or - # :if => Proc.new { |user| user.signup_step > 2 }). The method, proc - # or string should return or evaluate to a true or false value. + # the validation should occur (e.g. if: :allow_validation, or + # if: Proc.new { |user| user.signup_step > 2 }). The method, proc + # or string should return or evaluate to a +true+ or +false+ value. # * :unless - Specifies a method, proc or string to call to determine - # if the validation should not occur (e.g. :unless => :skip_validation, - # or :unless => Proc.new { |user| user.signup_step <= 2 }). The method, - # proc or string should return or evaluate to a true or false value. + # if the validation should not occur (e.g. unless: :skip_validation, + # or unless: Proc.new { |user| user.signup_step <= 2 }). The method, + # proc or string should return or evaluate to a +true+ or +false+ value. # * :strict - Specifies whether validation should be strict. # See ActiveModel::Validation#validates! for more information. - # def validates_presence_of(*attr_names) validates_with PresenceValidator, _merge_attributes(attr_names) end diff --git a/activerecord/lib/active_record/validations/uniqueness.rb b/activerecord/lib/active_record/validations/uniqueness.rb index c117872ac8..f3620c1324 100644 --- a/activerecord/lib/active_record/validations/uniqueness.rb +++ b/activerecord/lib/active_record/validations/uniqueness.rb @@ -2,7 +2,7 @@ require 'active_support/core_ext/array/prepend_and_append' module ActiveRecord module Validations - class UniquenessValidator < ActiveModel::EachValidator #:nodoc: + class UniquenessValidator < ActiveModel::EachValidator # :nodoc: def initialize(options) super(options.reverse_merge(:case_sensitive => true)) end @@ -199,7 +199,7 @@ module ActiveRecord # can catch it and restart the transaction (e.g. by telling the user # that the title already exists, and asking him to re-enter the title). # This technique is also known as optimistic concurrency control: - # http://en.wikipedia.org/wiki/Optimistic_concurrency_control + # http://en.wikipedia.org/wiki/Optimistic_concurrency_control. # # The bundled ActiveRecord::ConnectionAdapters distinguish unique index # constraint errors from other types of database errors by throwing an @@ -209,10 +209,10 @@ module ActiveRecord # # The following bundled adapters throw the ActiveRecord::RecordNotUnique exception: # - # * ActiveRecord::ConnectionAdapters::MysqlAdapter - # * ActiveRecord::ConnectionAdapters::Mysql2Adapter - # * ActiveRecord::ConnectionAdapters::SQLite3Adapter - # * ActiveRecord::ConnectionAdapters::PostgreSQLAdapter + # * ActiveRecord::ConnectionAdapters::MysqlAdapter. + # * ActiveRecord::ConnectionAdapters::Mysql2Adapter. + # * ActiveRecord::ConnectionAdapters::SQLite3Adapter. + # * ActiveRecord::ConnectionAdapters::PostgreSQLAdapter. def validates_uniqueness_of(*attr_names) validates_with UniquenessValidator, _merge_attributes(attr_names) end -- cgit v1.2.3 From a0457317183a7ab0add760cf6678b72c4e3c0e8f Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Sat, 22 Sep 2012 18:29:37 -0500 Subject: remove added indentation from the last commit [ci skip] --- activerecord/lib/active_record/core.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/activerecord/lib/active_record/core.rb b/activerecord/lib/active_record/core.rb index c01a472d76..f97c363871 100644 --- a/activerecord/lib/active_record/core.rb +++ b/activerecord/lib/active_record/core.rb @@ -1,4 +1,4 @@ - require 'active_support/core_ext/hash/indifferent_access' +require 'active_support/core_ext/hash/indifferent_access' require 'active_support/core_ext/object/duplicable' require 'thread' -- cgit v1.2.3 From 191ddf26379670b477bd63bccf8debbe16d20ed9 Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Sat, 22 Sep 2012 19:42:40 -0500 Subject: update AC::Caching documentation [ci skip] --- actionpack/lib/action_controller/caching.rb | 10 +-- .../lib/action_controller/caching/actions.rb | 26 +++---- .../lib/action_controller/caching/fragments.rb | 36 ++++----- actionpack/lib/action_controller/caching/pages.rb | 91 ++++++++++++---------- .../lib/action_controller/caching/sweeping.rb | 27 ++++--- 5 files changed, 103 insertions(+), 87 deletions(-) diff --git a/actionpack/lib/action_controller/caching.rb b/actionpack/lib/action_controller/caching.rb index be29099fbe..fc27a0774b 100644 --- a/actionpack/lib/action_controller/caching.rb +++ b/actionpack/lib/action_controller/caching.rb @@ -23,10 +23,10 @@ module ActionController #:nodoc: # Configuration examples (MemoryStore is the default): # # config.action_controller.cache_store = :memory_store - # config.action_controller.cache_store = :file_store, "/path/to/cache/directory" - # config.action_controller.cache_store = :mem_cache_store, "localhost" - # config.action_controller.cache_store = :mem_cache_store, Memcached::Rails.new("localhost:11211") - # config.action_controller.cache_store = MyOwnStore.new("parameter") + # config.action_controller.cache_store = :file_store, '/path/to/cache/directory' + # config.action_controller.cache_store = :mem_cache_store, 'localhost' + # config.action_controller.cache_store = :mem_cache_store, Memcached::Rails.new('localhost:11211') + # config.action_controller.cache_store = MyOwnStore.new('parameter') module Caching extend ActiveSupport::Concern extend ActiveSupport::Autoload @@ -73,7 +73,7 @@ module ActionController #:nodoc: end protected - # Convenience accessor + # Convenience accessor. def cache(key, options = {}, &block) if cache_configured? cache_store.fetch(ActiveSupport::Cache.expand_cache_key(key, :controller), options, &block) diff --git a/actionpack/lib/action_controller/caching/actions.rb b/actionpack/lib/action_controller/caching/actions.rb index eb3aa05a25..bf16fe267c 100644 --- a/actionpack/lib/action_controller/caching/actions.rb +++ b/actionpack/lib/action_controller/caching/actions.rb @@ -1,16 +1,16 @@ require 'set' -module ActionController #:nodoc: +module ActionController module Caching # Action caching is similar to page caching by the fact that the entire # output of the response is cached, but unlike page caching, every # request still goes through Action Pack. The key benefit of this is # that filters run before the cache is served, which allows for # authentication and other restrictions on whether someone is allowed - # to execute such action. Example: + # to execute such action. # # class ListsController < ApplicationController - # before_filter :authenticate, :except => :public + # before_filter :authenticate, except: :public # # caches_page :public # caches_action :index, :show @@ -35,8 +35,8 @@ module ActionController #:nodoc: # http://david.example.com/lists.xml # are treated like separate requests and so are cached separately. # Keep in mind when expiring an action cache that - # :action => 'lists' is not the same as - # :action => 'list', :format => :xml. + # action: 'lists' is not the same as + # action: 'list', format: :xml. # # You can modify the default action cache path by passing a # :cache_path option. This will be passed directly to @@ -53,18 +53,18 @@ module ActionController #:nodoc: # The following example depicts some of the points made above: # # class ListsController < ApplicationController - # before_filter :authenticate, :except => :public + # before_filter :authenticate, except: :public # # caches_page :public # - # caches_action :index, :if => Proc.new do + # caches_action :index, if: Proc.new do # !request.format.json? # cache if is not a JSON request # end # - # caches_action :show, :cache_path => { :project => 1 }, - # :expires_in => 1.hour + # caches_action :show, cache_path: { project: 1 }, + # expires_in: 1.hour # - # caches_action :feed, :cache_path => Proc.new do + # caches_action :feed, cache_path: Proc.new do # if params[:user_id] # user_list_url(params[:user_id, params[:id]) # else @@ -73,7 +73,7 @@ module ActionController #:nodoc: # end # end # - # If you pass :layout => false, it will only cache your action + # If you pass layout: false, it will only cache your action # content. That's useful when your layout has dynamic information. # # Warning: If the format of the request is determined by the Accept HTTP @@ -162,9 +162,9 @@ module ActionController #:nodoc: class ActionCachePath attr_reader :path, :extension - # If +infer_extension+ is true, the cache path extension is looked up from the request's + # If +infer_extension+ is +true+, the cache path extension is looked up from the request's # path and format. This is desirable when reading and writing the cache, but not when - # expiring the cache - expire_action should expire the same files regardless of the + # expiring the cache - +expire_action+ should expire the same files regardless of the # request format. def initialize(controller, options = {}, infer_extension = true) if infer_extension diff --git a/actionpack/lib/action_controller/caching/fragments.rb b/actionpack/lib/action_controller/caching/fragments.rb index 9c77b0ccf4..879d5fdd94 100644 --- a/actionpack/lib/action_controller/caching/fragments.rb +++ b/actionpack/lib/action_controller/caching/fragments.rb @@ -1,29 +1,29 @@ -module ActionController #:nodoc: +module ActionController module Caching - # Fragment caching is used for caching various blocks within + # Fragment caching is used for caching various blocks within # views without caching the entire action as a whole. This is - # useful when certain elements of an action change frequently or - # depend on complicated state while other parts rarely change or + # useful when certain elements of an action change frequently or + # depend on complicated state while other parts rarely change or # can be shared amongst multiple parties. The caching is done using - # the cache helper available in the Action View. See + # the +cache+ helper available in the Action View. See # ActionView::Helpers::CacheHelper for more information. # # While it's strongly recommended that you use key-based cache # expiration (see links in CacheHelper for more information), # it is also possible to manually expire caches. For example: # - # expire_fragment("name_of_cache") + # expire_fragment('name_of_cache') module Fragments - # Given a key (as described in expire_fragment), returns - # a key suitable for use in reading, writing, or expiring a + # Given a key (as described in +expire_fragment+), returns + # a key suitable for use in reading, writing, or expiring a # cached fragment. All keys are prefixed with views/ and uses # ActiveSupport::Cache.expand_cache_key for the expansion. def fragment_cache_key(key) ActiveSupport::Cache.expand_cache_key(key.is_a?(Hash) ? url_for(key).split("://").last : key, :views) end - # Writes content to the location signified by - # key (see expire_fragment for acceptable formats). + # Writes +content+ to the location signified by + # +key+ (see +expire_fragment+ for acceptable formats). def write_fragment(key, content, options = nil) return content unless cache_configured? @@ -35,8 +35,8 @@ module ActionController #:nodoc: content end - # Reads a cached fragment from the location signified by key - # (see expire_fragment for acceptable formats). + # Reads a cached fragment from the location signified by +key+ + # (see +expire_fragment+ for acceptable formats). def read_fragment(key, options = nil) return unless cache_configured? @@ -47,8 +47,8 @@ module ActionController #:nodoc: end end - # Check if a cached fragment from the location signified by - # key exists (see expire_fragment for acceptable formats) + # Check if a cached fragment from the location signified by + # +key+ exists (see +expire_fragment+ for acceptable formats). def fragment_exist?(key, options = nil) return unless cache_configured? key = fragment_cache_key(key) @@ -65,7 +65,7 @@ module ActionController #:nodoc: # * String - This would normally take the form of a path, like # pages/45/notes. # * Hash - Treated as an implicit call to +url_for+, like - # {:controller => "pages", :action => "notes", :id => 45} + # { controller: 'pages', action: 'notes', id: 45} # * Regexp - Will remove any fragment that matches, so # %r{pages/\d*/notes} might remove all notes. Make sure you # don't use anchors in the regex (^ or $) because @@ -74,8 +74,8 @@ module ActionController #:nodoc: # only supported on caches that can iterate over all keys (unlike # memcached). # - # +options+ is passed through to the cache store's delete - # method (or delete_matched, for Regexp keys.) + # +options+ is passed through to the cache store's +delete+ + # method (or delete_matched, for Regexp keys). def expire_fragment(key, options = nil) return unless cache_configured? key = fragment_cache_key(key) unless key.is_a?(Regexp) @@ -89,7 +89,7 @@ module ActionController #:nodoc: end end - def instrument_fragment_cache(name, key) + def instrument_fragment_cache(name, key) # :nodoc: ActiveSupport::Notifications.instrument("#{name}.action_controller", :key => key){ yield } end end diff --git a/actionpack/lib/action_controller/caching/pages.rb b/actionpack/lib/action_controller/caching/pages.rb index 73b8cd383c..3cf8d965ff 100644 --- a/actionpack/lib/action_controller/caching/pages.rb +++ b/actionpack/lib/action_controller/caching/pages.rb @@ -1,60 +1,72 @@ require 'fileutils' require 'active_support/core_ext/class/attribute_accessors' -module ActionController #:nodoc: +module ActionController module Caching - # Page caching is an approach to caching where the entire action output of is stored as a HTML file that the web server - # can serve without going through Action Pack. This is the fastest way to cache your content as opposed to going dynamically - # through the process of generating the content. Unfortunately, this incredible speed-up is only available to stateless pages - # where all visitors are treated the same. Content management systems -- including weblogs and wikis -- have many pages that are - # a great fit for this approach, but account-based systems where people log in and manipulate their own data are often less - # likely candidates. + # Page caching is an approach to caching where the entire action output of is + # stored as a HTML file that the web server can serve without going through + # Action Pack. This is the fastest way to cache your content as opposed to going + # dynamically through the process of generating the content. Unfortunately, this + # incredible speed-up is only available to stateless pages where all visitors are + # treated the same. Content management systems -- including weblogs and wikis -- + # have many pages that are a great fit for this approach, but account-based systems + # where people log in and manipulate their own data are often less likely candidates. # - # Specifying which actions to cache is done through the caches_page class method: + # Specifying which actions to cache is done through the +caches_page+ class method: # # class WeblogController < ActionController::Base # caches_page :show, :new # end # - # This will generate cache files such as weblog/show/5.html and weblog/new.html, which match the URLs used - # that would normally trigger dynamic page generation. Page caching works by configuring a web server to first check for the - # existence of files on disk, and to serve them directly when found, without passing the request through to Action Pack. - # This is much faster than handling the full dynamic request in the usual way. + # This will generate cache files such as weblog/show/5.html and + # weblog/new.html, which match the URLs used that would normally trigger + # dynamic page generation. Page caching works by configuring a web server to first + # check for the existence of files on disk, and to serve them directly when found, + # without passing the request through to Action Pack. This is much faster than + # handling the full dynamic request in the usual way. # - # Expiration of the cache is handled by deleting the cached file, which results in a lazy regeneration approach where the cache - # is not restored before another hit is made against it. The API for doing so mimics the options from +url_for+ and friends: + # Expiration of the cache is handled by deleting the cached file, which results + # in a lazy regeneration approach where the cache is not restored before another + # hit is made against it. The API for doing so mimics the options from +url_for+ and friends: # # class WeblogController < ActionController::Base # def update # List.update(params[:list][:id], params[:list]) - # expire_page :action => "show", :id => params[:list][:id] - # redirect_to :action => "show", :id => params[:list][:id] + # expire_page action: 'show', id: params[:list][:id] + # redirect_to action: 'show', id: params[:list][:id] # end # end # - # Additionally, you can expire caches using Sweepers that act on changes in the model to determine when a cache is supposed to be - # expired. + # Additionally, you can expire caches using Sweepers that act on changes in + # the model to determine when a cache is supposed to be expired. module Pages extend ActiveSupport::Concern included do - # The cache directory should be the document root for the web server and is set using Base.page_cache_directory = "/document/root". - # For Rails, this directory has already been set to Rails.public_path (which is usually set to Rails.root + "/public"). Changing - # this setting can be useful to avoid naming conflicts with files in public/, but doing so will likely require configuring your - # web server to look in the new location for cached files. + # The cache directory should be the document root for the web server and is + # set using Base.page_cache_directory = "/document/root". For Rails, + # this directory has already been set to Rails.public_path (which is usually + # set to Rails.root + "/public"). Changing this setting can be useful + # to avoid naming conflicts with files in public/, but doing so will + # likely require configuring your web server to look in the new location for + # cached files. class_attribute :page_cache_directory self.page_cache_directory ||= '' - # Most Rails requests do not have an extension, such as /weblog/new. In these cases, the page caching mechanism will add one in - # order to make it easy for the cached files to be picked up properly by the web server. By default, this cache extension is .html. - # If you want something else, like .php or .shtml, just set Base.page_cache_extension. In cases where a request already has an - # extension, such as .xml or .rss, page caching will not add an extension. This allows it to work well with RESTful apps. + # Most Rails requests do not have an extension, such as /weblog/new. + # In these cases, the page caching mechanism will add one in order to make it + # easy for the cached files to be picked up properly by the web server. By + # default, this cache extension is .html. If you want something else, + # like .php or .shtml, just set Base.page_cache_extension. + # In cases where a request already has an extension, such as .xml + # or .rss, page caching will not add an extension. This allows it + # to work well with RESTful apps. class_attribute :page_cache_extension self.page_cache_extension ||= '.html' - # The compression used for gzip. If false (default), the page is not compressed. - # If can be a symbol showing the ZLib compression method, for example, :best_compression - # or :best_speed or an integer configuring the compression level. + # The compression used for gzip. If +false+ (default), the page is not compressed. + # If can be a symbol showing the ZLib compression method, for example, :best_compression + # or :best_speed or an integer configuring the compression level. class_attribute :page_cache_compression self.page_cache_compression ||= false end @@ -62,7 +74,7 @@ module ActionController #:nodoc: module ClassMethods # Expires the page that was cached with the +path+ as a key. # - # expire_page "/lists/show" + # expire_page '/lists/show' def expire_page(path) return unless perform_caching path = page_cache_path(path) @@ -75,7 +87,7 @@ module ActionController #:nodoc: # Manually cache the +content+ in the key determined by +path+. # - # cache_page "I'm the cached content", "/lists/show" + # cache_page "I'm the cached content", '/lists/show' def cache_page(content, path, extension = nil, gzip = Zlib::BEST_COMPRESSION) return unless perform_caching path = page_cache_path(path, extension) @@ -90,19 +102,19 @@ module ActionController #:nodoc: end # Caches the +actions+ using the page-caching approach that'll store - # the cache in a path within the page_cache_directory that + # the cache in a path within the +page_cache_directory+ that # matches the triggering url. # - # You can also pass a :gzip option to override the class configuration one. + # You can also pass a :gzip option to override the class configuration one. # # # cache the index action # caches_page :index # # # cache the index action except for JSON requests - # caches_page :index, :if => Proc.new { !request.format.json? } + # caches_page :index, if: Proc.new { !request.format.json? } # # # don't gzip images - # caches_page :image, :gzip => false + # caches_page :image, gzip: false def caches_page(*actions) return unless perform_caching options = actions.extract_options! @@ -144,7 +156,7 @@ module ActionController #:nodoc: # Expires the page that was cached with the +options+ as a key. # - # expire_page :controller => "lists", :action => "show" + # expire_page controller: 'lists', action: 'show' def expire_page(options = {}) return unless self.class.perform_caching @@ -161,10 +173,11 @@ module ActionController #:nodoc: end end - # Manually cache the +content+ in the key determined by +options+. If no content is provided, the contents of response.body is used. - # If no options are provided, the url of the current request being handled is used. + # Manually cache the +content+ in the key determined by +options+. If no content is provided, + # the contents of response.body is used. If no options are provided, the url of the current + # request being handled is used. # - # cache_page "I'm the cached content", :controller => "lists", :action => "show" + # cache_page "I'm the cached content", controller: 'lists', action: 'show' def cache_page(content = nil, options = nil, gzip = Zlib::BEST_COMPRESSION) return unless self.class.perform_caching && caching_allowed? diff --git a/actionpack/lib/action_controller/caching/sweeping.rb b/actionpack/lib/action_controller/caching/sweeping.rb index 271d5f06b8..317ac74b40 100644 --- a/actionpack/lib/action_controller/caching/sweeping.rb +++ b/actionpack/lib/action_controller/caching/sweeping.rb @@ -1,38 +1,41 @@ -module ActionController #:nodoc: +module ActionController module Caching - # Sweepers are the terminators of the caching world and responsible for expiring caches when Active Record objects change. - # They do this by being half-observers, half-filters and implementing callbacks for both roles. A Sweeper example: + # Sweepers are the terminators of the caching world and responsible for expiring + # caches when Active Record objects change. They do this by being half-observers, + # half-filters and implementing callbacks for both roles. # # class ListSweeper < ActionController::Caching::Sweeper # observe List, Item # # def after_save(record) # list = record.is_a?(List) ? record : record.list - # expire_page(:controller => "lists", :action => %w( show public feed ), :id => list.id) - # expire_action(:controller => "lists", :action => "all") - # list.shares.each { |share| expire_page(:controller => "lists", :action => "show", :id => share.url_key) } + # expire_page(controller: 'lists', action: %w( show public feed ), id: list.id) + # expire_action(controller: 'lists', action: 'all') + # list.shares.each { |share| expire_page(controller: 'lists', action: 'show', id: share.url_key) } # end # end # - # The sweeper is assigned in the controllers that wish to have its job performed using the cache_sweeper class method: + # The sweeper is assigned in the controllers that wish to have its job performed using + # the +cache_sweeper+ class method: # # class ListsController < ApplicationController # caches_action :index, :show, :public, :feed - # cache_sweeper :list_sweeper, :only => [ :edit, :destroy, :share ] + # cache_sweeper :list_sweeper, only: [ :edit, :destroy, :share ] # end # # In the example above, four actions are cached and three actions are responsible for expiring those caches. # - # You can also name an explicit class in the declaration of a sweeper, which is needed if the sweeper is in a module: + # You can also name an explicit class in the declaration of a sweeper, which is needed + # if the sweeper is in a module: # # class ListsController < ApplicationController # caches_action :index, :show, :public, :feed - # cache_sweeper OpenBar::Sweeper, :only => [ :edit, :destroy, :share ] + # cache_sweeper OpenBar::Sweeper, only: [ :edit, :destroy, :share ] # end module Sweeping extend ActiveSupport::Concern - module ClassMethods #:nodoc: + module ClassMethods # :nodoc: def cache_sweeper(*sweepers) configuration = sweepers.extract_options! @@ -51,7 +54,7 @@ module ActionController #:nodoc: end if defined?(ActiveRecord) and defined?(ActiveRecord::Observer) - class Sweeper < ActiveRecord::Observer #:nodoc: + class Sweeper < ActiveRecord::Observer # :nodoc: attr_accessor :controller def initialize(*args) -- cgit v1.2.3 From 417aa431eb43a8ecbc7edae2d056edebf4f8792f Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Sat, 22 Sep 2012 20:07:49 -0500 Subject: update AC::ConditionalGet documentation [ci skip] --- .../lib/action_controller/metal/conditional_get.rb | 58 ++++++++++++---------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/actionpack/lib/action_controller/metal/conditional_get.rb b/actionpack/lib/action_controller/metal/conditional_get.rb index 12ef68ff26..3f37a6a618 100644 --- a/actionpack/lib/action_controller/metal/conditional_get.rb +++ b/actionpack/lib/action_controller/metal/conditional_get.rb @@ -18,8 +18,6 @@ module ActionController # may want to add the current user id to be part of the etag to prevent authorized displaying # of cached pages. # - # === Example - # # class InvoicesController < ApplicationController # etag { current_user.try :id } # @@ -34,25 +32,28 @@ module ActionController end end - # Sets the etag, last_modified, or both on the response and renders a + # Sets the etag, +last_modified+, or both on the response and renders a # 304 Not Modified response if the request is already fresh. # - # Parameters: - # * :etag - # * :last_modified - # * :public By default the Cache-Control header is private, set this to true if you want your application to be cachable by other devices (proxy caches). + # === Parameters: + # + # * :etag. + # * :last_modified. + # * :public By default the Cache-Control header is private, set this to + # +true+ if you want your application to be cachable by other devices (proxy caches). # - # Example: + # === Example: # # def show # @article = Article.find(params[:id]) - # fresh_when(:etag => @article, :last_modified => @article.created_at, :public => true) + # fresh_when(etag: @article, last_modified: @article.created_at, public: true) # end # # This will render the show template if the request isn't sending a matching etag or # If-Modified-Since header and just a 304 Not Modified response if there's a match. # - # You can also just pass a record where last_modified will be set by calling updated_at and the etag by passing the object itself. Example: + # You can also just pass a record where +last_modified+ will be set by calling + # +updated_at+ and the etag by passing the object itself. # # def show # @article = Article.find(params[:id]) @@ -81,22 +82,24 @@ module ActionController head :not_modified if request.fresh?(response) end - # Sets the etag and/or last_modified on the response and checks it against + # Sets the +etag+ and/or +last_modified+ on the response and checks it against # the client request. If the request doesn't match the options provided, the # request is considered stale and should be generated from scratch. Otherwise, # it's fresh and we don't need to generate anything and a reply of 304 Not Modified is sent. # - # Parameters: - # * :etag - # * :last_modified - # * :public By default the Cache-Control header is private, set this to true if you want your application to be cachable by other devices (proxy caches). + # === Parameters: + # + # * :etag. + # * :last_modified. + # * :public By default the Cache-Control header is private, set this to + # +true+ if you want your application to be cachable by other devices (proxy caches). # - # Example: + # === Example: # # def show # @article = Article.find(params[:id]) # - # if stale?(:etag => @article, :last_modified => @article.created_at) + # if stale?(etag: @article, last_modified: @article.created_at) # @statistics = @article.really_expensive_call # respond_to do |format| # # all the supported formats @@ -104,7 +107,8 @@ module ActionController # end # end # - # You can also just pass a record where last_modified will be set by calling updated_at and the etag by passing the object itself. Example: + # You can also just pass a record where +last_modified+ will be set by calling + # updated_at and the etag by passing the object itself. # # def show # @article = Article.find(params[:id]) @@ -122,7 +126,7 @@ module ActionController # def show # @article = Article.find(params[:id]) # - # if stale?(@article, :public => true) + # if stale?(@article, public: true) # @statistics = @article.really_expensive_call # respond_to do |format| # # all the supported formats @@ -134,18 +138,18 @@ module ActionController !request.fresh?(response) end - # Sets a HTTP 1.1 Cache-Control header. Defaults to issuing a private instruction, so that - # intermediate caches must not cache the response. + # Sets a HTTP 1.1 Cache-Control header. Defaults to issuing a +private+ + # instruction, so that intermediate caches must not cache the response. # # expires_in 20.minutes - # expires_in 3.hours, :public => true - # expires_in 3.hours, :public => true, :must_revalidate => true + # expires_in 3.hours, public: true + # expires_in 3.hours, public: true, must_revalidate: true # # This method will overwrite an existing Cache-Control header. # See http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html for more possibilities. # # The method will also ensure a HTTP Date header for client compatibility. - def expires_in(seconds, options = {}) #:doc: + def expires_in(seconds, options = {}) response.cache_control.merge!( :max_age => seconds, :public => options.delete(:public), @@ -157,9 +161,9 @@ module ActionController response.date = Time.now unless response.date? end - # Sets a HTTP 1.1 Cache-Control header of no-cache so no caching should occur by the browser or - # intermediate caches (like caching proxy servers). - def expires_now #:doc: + # Sets a HTTP 1.1 Cache-Control header of no-cache so no caching should + # occur by the browser or intermediate caches (like caching proxy servers). + def expires_now response.cache_control.replace(:no_cache => true) end -- cgit v1.2.3 From 4fc620cc9124cb908a9585dc680b935f3c755dd7 Mon Sep 17 00:00:00 2001 From: Cory Logan Date: Sun, 23 Sep 2012 17:08:35 +0700 Subject: Removed duplicate line describing "default_options". [ci skip] --- guides/source/action_mailer_basics.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guides/source/action_mailer_basics.md b/guides/source/action_mailer_basics.md index de5c15fe54..5e731d0a18 100644 --- a/guides/source/action_mailer_basics.md +++ b/guides/source/action_mailer_basics.md @@ -482,7 +482,6 @@ The following configuration options are best made in one of the environment file |`deliveries`|Keeps an array of all the emails sent out through the Action Mailer with delivery_method :test. Most useful for unit and functional testing.| |`default_options`|Allows you to set default values for the `mail` method options (`:from`, `:reply_to`, etc.).| |`async`|Setting this flag will turn on asynchronous message sending, message rendering and delivery will be pushed to `Rails.queue` for processing.| -|`default_options`|Allows you to set default values for the `mail` method options (`:from`, `:reply_to`, etc.).| ### Example Action Mailer Configuration -- cgit v1.2.3 From bc87712bc6938f445d7441c5709a89aeaa1abb54 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Mon, 24 Sep 2012 16:11:29 +0200 Subject: String.to_time documentation along examples. --- .../lib/active_support/core_ext/string/conversions.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/activesupport/lib/active_support/core_ext/string/conversions.rb b/activesupport/lib/active_support/core_ext/string/conversions.rb index 022b376aec..9b9d83932e 100644 --- a/activesupport/lib/active_support/core_ext/string/conversions.rb +++ b/activesupport/lib/active_support/core_ext/string/conversions.rb @@ -2,7 +2,17 @@ require 'date' require 'active_support/core_ext/time/calculations' class String - # Form can be either :utc (default) or :local. + # Converts a string to a Time value. + # The +form+ can be either :utc or :local (default :utc). + # + # The time is parsed using Date._parse method. + # If +form+ is :local, then time is formatted using Time.zone + # + # "3-2-2012".to_time # => 2012-02-03 00:00:00 UTC + # "12:20".to_time # => ArgumentError: invalid date + # "2012-12-13 06:12".to_time # => 2012-12-13 06:12:00 UTC + # "2012-12-13T06:12".to_time # => 2012-12-13 06:12:00 UTC + # "2012-12-13T06:12".to_time(:local) # => 2012-12-13 06:12:00 +0100 def to_time(form = :utc) unless blank? date_values = ::Date._parse(self, false). -- cgit v1.2.3 From 530102f656068274be8e3ea5fc873a3432d8e397 Mon Sep 17 00:00:00 2001 From: Francesco Rodriguez Date: Mon, 24 Sep 2012 15:39:45 -0500 Subject: add a note about DynamicForm in error_messages_for section [ci skip] --- guides/source/i18n.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/guides/source/i18n.md b/guides/source/i18n.md index f3360156cc..09e89938bb 100644 --- a/guides/source/i18n.md +++ b/guides/source/i18n.md @@ -816,7 +816,8 @@ So, for example, instead of the default error message `"can not be blank"` you c #### Translations for the Active Record `error_messages_for` Helper -If you are using the Active Record `error_messages_for` helper, you will want to add translations for it. +If you are using the Active Record `error_messages_for` helper, you will want to add +translations for it. Rails ships with the following translations: @@ -831,6 +832,9 @@ en: body: "There were problems with the following fields:" ``` +NOTE: In order to use this helper, you need to install [DynamicForm](https://github.com/joelmoss/dynamic_form) +gem. You can install it as a gem by adding this line to your Gemfile: `gem 'dynamic_form'`. + ### Overview of Other Built-In Methods that Provide I18n Support Rails uses fixed strings and other localizations, such as format strings and other format information in a couple of helpers. Here's a brief overview. -- cgit v1.2.3 From c9a6c6c8d18006d92a87c2d09bc9d6e5b0b30086 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juanjo=20Baz=C3=A1n?= Date: Mon, 24 Sep 2012 23:28:02 +0200 Subject: remove duplication --- guides/source/active_record_querying.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index 2fb0bf1d69..d46b35f8df 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -68,7 +68,6 @@ The methods are: * `none` * `offset` * `order` -* `none` * `preload` * `readonly` * `references` -- cgit v1.2.3 From f51d95aee52d86b9d6bd8e1d10d35d73349bfc97 Mon Sep 17 00:00:00 2001 From: Igor Zubkov Date: Tue, 25 Sep 2012 01:50:21 +0300 Subject: Fix typo in 4_0_release_notes.md --- guides/source/4_0_release_notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/4_0_release_notes.md b/guides/source/4_0_release_notes.md index c3921ea541..183715491a 100644 --- a/guides/source/4_0_release_notes.md +++ b/guides/source/4_0_release_notes.md @@ -538,7 +538,7 @@ Active Record * `mysql` and `mysql2` connections will set `SQL_MODE=STRICT_ALL_TABLES` by default to avoid silent data loss. This can be disabled by specifying `strict: false` in `config/database.yml`. -* Added default order to `ActiveRecord::Base#first` to assure consistent results among diferent database engines. Introduced `ActiveRecord::Base#take` as a replacement to the old behavior. +* Added default order to `ActiveRecord::Base#first` to assure consistent results among different database engines. Introduced `ActiveRecord::Base#take` as a replacement to the old behavior. * Added an `:index` option to automatically create indexes for `references` and `belongs_to` statements in migrations. This can be either a boolean or a hash that is identical to options available to the `add_index` method: -- cgit v1.2.3 From 150561779d3231c21add60936e14d7177997da13 Mon Sep 17 00:00:00 2001 From: schneems Date: Mon, 24 Sep 2012 18:49:17 -0500 Subject: remove misleading comment in Rakefile Comment introduced in https://github.com/rails/rails/commit/bbb3e5a8 before rake `isolate:test` was even introduced https://github.com/rails/rails/commit/bbb3e5a8 --- railties/Rakefile | 3 --- 1 file changed, 3 deletions(-) diff --git a/railties/Rakefile b/railties/Rakefile index 993ba840ff..8576275aea 100644 --- a/railties/Rakefile +++ b/railties/Rakefile @@ -8,9 +8,6 @@ require 'rbconfig' task :default => :test task :test => 'test:isolated' -## This is required until the regular test task -## below passes. It's not ideal, but at least -## we can see the failures namespace :test do task :isolated do dir = ENV["TEST_DIR"] || "**" -- cgit v1.2.3 From bfafa999ddaa203224ac0222203517a0d2a3f6bf Mon Sep 17 00:00:00 2001 From: schneems Date: Mon, 24 Sep 2012 22:51:11 -0500 Subject: add documentation to generated routes Mention that in addition to `rake routes` a developer can also visit `/rails/info/routes` in the browser. --- guides/code/getting_started/config/routes.rb | 3 ++- railties/lib/rails/generators/rails/app/templates/config/routes.rb | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/guides/code/getting_started/config/routes.rb b/guides/code/getting_started/config/routes.rb index 04a6bd374e..724edf4727 100644 --- a/guides/code/getting_started/config/routes.rb +++ b/guides/code/getting_started/config/routes.rb @@ -55,7 +55,8 @@ Blog::Application.routes.draw do # just remember to delete public/index.html. root :to => "welcome#index" - # See how all your routes lay out with "rake routes" + # See how all your routes lay out by running `$ rake routes` + # or by visiting `/rails/info/routes` in your browser # This is a legacy wild controller route that's not recommended for RESTful applications. # Note: This route will make all actions in every controller accessible via GET requests. diff --git a/railties/lib/rails/generators/rails/app/templates/config/routes.rb b/railties/lib/rails/generators/rails/app/templates/config/routes.rb index f6b1ef1feb..1b32629465 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/routes.rb +++ b/railties/lib/rails/generators/rails/app/templates/config/routes.rb @@ -51,5 +51,6 @@ # end - # See how all your routes lay out with "rake routes". + # See how all your routes lay out by running `$ rake routes` + # or by visiting `/rails/info/routes` in your browser end -- cgit v1.2.3 From 2029c2ac18c12a08f0ddfdcadf90e50c54520895 Mon Sep 17 00:00:00 2001 From: Bryan Larsen Date: Tue, 25 Sep 2012 13:29:53 -0300 Subject: Update guides/source/routing.md --- guides/source/routing.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/guides/source/routing.md b/guides/source/routing.md index 27fd2a35c4..3acb7fa0e5 100644 --- a/guides/source/routing.md +++ b/guides/source/routing.md @@ -401,6 +401,18 @@ resources :photos do end ``` +#### Adding Routes for Additional New Actions + +To add an alternate new action using the `:on` shortcut: + +```ruby +resources :comments do + get 'preview', :on => :new +end +``` + +This will enable Rails to recognize paths such as `/comments/new/preview` with GET, and route to the `preview` action of `CommentsController`. It will also create the `preview_new_comment_url` and `preview_new_comment_path` route helpers. + #### A Note of Caution If you find yourself adding many extra actions to a resourceful route, it's time to stop and ask yourself whether you're disguising the presence of another resource. -- cgit v1.2.3 From a200ebd8818d045e035c6e025733f8868f5a0181 Mon Sep 17 00:00:00 2001 From: Nihad Abbasov Date: Tue, 25 Sep 2012 23:20:57 +0600 Subject: update image_tag output in examples to actual [ci-skip] --- actionpack/lib/action_view/helpers/asset_tag_helper.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index db4da6f9c8..e0e6ab1c9a 100644 --- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb @@ -369,13 +369,13 @@ module ActionView # value is not in the correct format. # # image_tag("icon") - # # => Icon + # # => Icon # image_tag("icon.png") - # # => Icon + # # => Icon # image_tag("icon.png", :size => "16x10", :alt => "Edit Entry") - # # => Edit Entry + # # => Edit Entry # image_tag("/icons/icon.gif", :size => "16x16") - # # => Icon + # # => Icon # image_tag("/icons/icon.gif", :height => '32', :width => '32') # # => Icon # image_tag("/icons/icon.gif", :class => "menu_icon") -- cgit v1.2.3 From 15d475a63b0beec2e1e735d49103e642ea54dc78 Mon Sep 17 00:00:00 2001 From: Steve Klabnik Date: Wed, 26 Sep 2012 07:59:18 -0700 Subject: Remove readonly notice. You need to have @implicit_readonly set for this to happen, and it's false by defualt. Fixes #3386. --- guides/source/active_record_querying.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/guides/source/active_record_querying.md b/guides/source/active_record_querying.md index d46b35f8df..1ae6a1f204 100644 --- a/guides/source/active_record_querying.md +++ b/guides/source/active_record_querying.md @@ -546,8 +546,6 @@ By default, `Model.find` selects all the fields from the result set using `selec To select only a subset of fields from the result set, you can specify the subset via the `select` method. -NOTE: If the `select` method is used, all the returning objects will be [read only](#readonly-objects). - For example, to select only `viewable_by` and `locked` columns: ```ruby -- cgit v1.2.3 From 6ee8e929c30ff7c95bab65bee6e9ce503c3c3331 Mon Sep 17 00:00:00 2001 From: cczona Date: Wed, 26 Sep 2012 13:57:03 -0700 Subject: typo fix: remove duplicate period --- guides/source/asset_pipeline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/asset_pipeline.md b/guides/source/asset_pipeline.md index be7ca5107d..fc0092a93e 100644 --- a/guides/source/asset_pipeline.md +++ b/guides/source/asset_pipeline.md @@ -42,7 +42,7 @@ The first feature of the pipeline is to concatenate assets. This is important in Rails 2.x introduced the ability to concatenate JavaScript and CSS assets by placing `:cache => true` at the end of the `javascript_include_tag` and `stylesheet_link_tag` methods. But this technique has some limitations. For example, it cannot generate the caches in advance, and it is not able to transparently include assets provided by third-party libraries. -Starting with version 3.1, Rails defaults to concatenating all JavaScript files into one master `.js` file and all CSS files into one master `.css` file. As you'll learn later in this guide, you can customize this strategy to group files any way you like. In production, Rails inserts an MD5 fingerprint into each filename so that the file is cached by the web browser. You can invalidate the cache by altering this fingerprint, which happens automatically whenever you change the file contents.. +Starting with version 3.1, Rails defaults to concatenating all JavaScript files into one master `.js` file and all CSS files into one master `.css` file. As you'll learn later in this guide, you can customize this strategy to group files any way you like. In production, Rails inserts an MD5 fingerprint into each filename so that the file is cached by the web browser. You can invalidate the cache by altering this fingerprint, which happens automatically whenever you change the file contents. The second feature of the asset pipeline is asset minification or compression. For CSS files, this is done by removing whitespace and comments. For JavaScript, more complex processes can be applied. You can choose from a set of built in options or specify your own. -- cgit v1.2.3 From 7a2b8099efae1f51024dd9a198e8e21fae2071e7 Mon Sep 17 00:00:00 2001 From: Teng Siong Ong Date: Thu, 27 Sep 2012 01:53:04 -0700 Subject: bleakhouse is no longer useful for rails and outdated. --- guides/source/debugging_rails_applications.md | 56 +-------------------------- 1 file changed, 1 insertion(+), 55 deletions(-) diff --git a/guides/source/debugging_rails_applications.md b/guides/source/debugging_rails_applications.md index 9f8a3d942c..b29b8ba230 100644 --- a/guides/source/debugging_rails_applications.md +++ b/guides/source/debugging_rails_applications.md @@ -638,60 +638,7 @@ Debugging Memory Leaks A Ruby application (on Rails or not), can leak memory - either in the Ruby code or at the C code level. -In this section, you will learn how to find and fix such leaks by using tools such as BleakHouse and Valgrind. - -### BleakHouse - -[BleakHouse](https://github.com/evan/bleak_house/) is a library for finding memory leaks. - -If a Ruby object does not go out of scope, the Ruby Garbage Collector won't sweep it since it is referenced somewhere. Leaks like this can grow slowly and your application will consume more and more memory, gradually affecting the overall system performance. This tool will help you find leaks on the Ruby heap. - -To install it run: - -```bash -$ gem install bleak_house -``` - -Then setup your application for profiling. Then add the following at the bottom of config/environment.rb: - -```ruby -require 'bleak_house' if ENV['BLEAK_HOUSE'] -``` - -Start a server instance with BleakHouse integration: - -```bash -$ RAILS_ENV=production BLEAK_HOUSE=1 ruby-bleak-house rails server -``` - -Make sure to run a couple hundred requests to get better data samples, then press `CTRL-C`. The server will stop and Bleak House will produce a dumpfile in `/tmp`: - -``` -** BleakHouse: working... -** BleakHouse: complete -** Bleakhouse: run 'bleak /tmp/bleak.5979.0.dump' to analyze. -``` - -To analyze it, just run the listed command. The top 20 leakiest lines will be listed: - -``` - 191691 total objects - Final heap size 191691 filled, 220961 free - Displaying top 20 most common line/class pairs - 89513 __null__:__null__:__node__ - 41438 __null__:__null__:String - 2348 /opt/local//lib/ruby/site_ruby/1.8/rubygems/specification.rb:557:Array - 1508 /opt/local//lib/ruby/gems/1.8/specifications/gettext-1.90.0.gemspec:14:String - 1021 /opt/local//lib/ruby/gems/1.8/specifications/heel-0.2.0.gemspec:14:String - 951 /opt/local//lib/ruby/site_ruby/1.8/rubygems/version.rb:111:String - 935 /opt/local//lib/ruby/site_ruby/1.8/rubygems/specification.rb:557:String - 834 /opt/local//lib/ruby/site_ruby/1.8/rubygems/version.rb:146:Array - ... -``` - -This way you can find where your application is leaking memory and fix it. - -If [BleakHouse](https://github.com/evan/bleak_house/) doesn't report any heap growth but you still have memory growth, you might have a broken C extension, or real leak in the interpreter. In that case, try using Valgrind to investigate further. +In this section, you will learn how to find and fix such leaks by using tool such as Valgrind. ### Valgrind @@ -726,4 +673,3 @@ References * [Debugging with ruby-debug](http://bashdb.sourceforge.net/ruby-debug.html) * [ruby-debug cheat sheet](http://cheat.errtheblog.com/s/rdebug/) * [Ruby on Rails Wiki: How to Configure Logging](http://wiki.rubyonrails.org/rails/pages/HowtoConfigureLogging) -* [Bleak House Documentation](http://blog.evanweaver.com/files/doc/fauna/bleak_house/) -- cgit v1.2.3 From 46f0fc6968493132da417e3e06f3c8aa09f54038 Mon Sep 17 00:00:00 2001 From: Sebastian Martinez Date: Thu, 27 Sep 2012 13:01:21 -0300 Subject: Add #update_columns entry in Rails 4.0 release notes [ci skip] --- guides/source/4_0_release_notes.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/guides/source/4_0_release_notes.md b/guides/source/4_0_release_notes.md index 183715491a..cce5bc5331 100644 --- a/guides/source/4_0_release_notes.md +++ b/guides/source/4_0_release_notes.md @@ -652,6 +652,14 @@ Active Record * PostgreSQL hstore types are automatically deserialized from the database. +* Added `#update_columns` method which updates the attributes from the passed-in hash without calling save, hence skipping validations and callbacks. `ActiveRecordError` will be raised when called on new objects or when at least one of the attributes is marked as read only. + + ```ruby + post.attributes # => {"id"=>2, "title"=>"My title", "body"=>"My content", "author"=>"Peter"} + post.update_columns({title: 'New title', author: 'Sebastian'}) # => true + post.attributes # => {"id"=>2, "title"=>"New title", "body"=>"My content", "author"=>"Sebastian"} + ``` + ### Deprecations * Deprecated most of the 'dynamic finder' methods. All dynamic methods except for `find_by_...` and `find_by_...!` are deprecated. Here's how you can rewrite the code: -- cgit v1.2.3 From 5917c6eb285b0327ab340ee2933db88d5f5ba3bd Mon Sep 17 00:00:00 2001 From: Grant Hutchins & Sabrina Staedt Date: Thu, 27 Sep 2012 15:37:24 -0400 Subject: Improve documentation for subscribe block --- activesupport/lib/active_support/notifications.rb | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/activesupport/lib/active_support/notifications.rb b/activesupport/lib/active_support/notifications.rb index aefba1c4f5..099117cebb 100644 --- a/activesupport/lib/active_support/notifications.rb +++ b/activesupport/lib/active_support/notifications.rb @@ -25,7 +25,17 @@ module ActiveSupport # == Subscribers # # You can consume those events and the information they provide by registering - # a subscriber. For instance, let's store all "render" events in an array: + # a subscriber. + # + # ActiveSupport::Notifications.subscribe('render') do |name, start, finish, id, payload| + # name # => String, name of the event (such as 'render' from above) + # start # => Time, when the instrumented block started execution + # finish # => Time, when the instrumented block ended execution + # id # => String, unique ID for this notification + # payload # => Hash, the payload + # end + # + # For instance, let's store all "render" events in an array: # # events = [] # -- cgit v1.2.3 From 0b30d668fa8188077c04da938272db05e9b3c461 Mon Sep 17 00:00:00 2001 From: Vijay Dev Date: Fri, 28 Sep 2012 22:49:43 +0530 Subject: Revert "add documentation to generated routes" This reverts commit bfafa999ddaa203224ac0222203517a0d2a3f6bf. Changes in templates aren't allowed in docrails. [ci skip] --- guides/code/getting_started/config/routes.rb | 3 +-- railties/lib/rails/generators/rails/app/templates/config/routes.rb | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/guides/code/getting_started/config/routes.rb b/guides/code/getting_started/config/routes.rb index 724edf4727..04a6bd374e 100644 --- a/guides/code/getting_started/config/routes.rb +++ b/guides/code/getting_started/config/routes.rb @@ -55,8 +55,7 @@ Blog::Application.routes.draw do # just remember to delete public/index.html. root :to => "welcome#index" - # See how all your routes lay out by running `$ rake routes` - # or by visiting `/rails/info/routes` in your browser + # See how all your routes lay out with "rake routes" # This is a legacy wild controller route that's not recommended for RESTful applications. # Note: This route will make all actions in every controller accessible via GET requests. diff --git a/railties/lib/rails/generators/rails/app/templates/config/routes.rb b/railties/lib/rails/generators/rails/app/templates/config/routes.rb index 1b32629465..f6b1ef1feb 100644 --- a/railties/lib/rails/generators/rails/app/templates/config/routes.rb +++ b/railties/lib/rails/generators/rails/app/templates/config/routes.rb @@ -51,6 +51,5 @@ # end - # See how all your routes lay out by running `$ rake routes` - # or by visiting `/rails/info/routes` in your browser + # See how all your routes lay out with "rake routes". end -- cgit v1.2.3 From cf3e760b87c49470c9a26ab3e2da67602474be1f Mon Sep 17 00:00:00 2001 From: Vijay Dev Date: Fri, 28 Sep 2012 23:15:09 +0530 Subject: copy editing [ci skip] --- guides/source/i18n.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/guides/source/i18n.md b/guides/source/i18n.md index 09e89938bb..a3c6b514a4 100644 --- a/guides/source/i18n.md +++ b/guides/source/i18n.md @@ -833,7 +833,7 @@ en: ``` NOTE: In order to use this helper, you need to install [DynamicForm](https://github.com/joelmoss/dynamic_form) -gem. You can install it as a gem by adding this line to your Gemfile: `gem 'dynamic_form'`. +gem by adding this line to your Gemfile: `gem 'dynamic_form'`. ### Overview of Other Built-In Methods that Provide I18n Support -- cgit v1.2.3