Merge branch 'master' of github.com:lifo/docrails
Conflicts: guides/source/action_mailer_basics.md
This commit is contained in:
commit
b15ce4a006
|
@ -14,7 +14,6 @@ module ActionView
|
|||
# # => <img alt="Rails" src="/assets/rails.png" />
|
||||
# stylesheet_link_tag("application")
|
||||
# # => <link href="/assets/application.css?body=1" media="screen" rel="stylesheet" />
|
||||
#
|
||||
module AssetTagHelper
|
||||
extend ActiveSupport::Concern
|
||||
|
||||
|
@ -50,7 +49,6 @@ module ActionView
|
|||
#
|
||||
# javascript_include_tag "http://www.example.com/xmlhr.js"
|
||||
# # => <script src="http://www.example.com/xmlhr.js"></script>
|
||||
#
|
||||
def javascript_include_tag(*sources)
|
||||
options = sources.extract_options!.stringify_keys
|
||||
path_options = options.extract!('protocol').symbolize_keys
|
||||
|
@ -67,7 +65,7 @@ module ActionView
|
|||
# you don't specify an extension, <tt>.css</tt> will be appended automatically.
|
||||
# You can modify the link attributes by passing a hash as the last argument.
|
||||
# For historical reasons, the 'media' attribute will always be present and defaults
|
||||
# to "screen", so you must explicitely set it to "all" for the stylesheet(s) to
|
||||
# to "screen", so you must explicitly set it to "all" for the stylesheet(s) to
|
||||
# apply to all media types.
|
||||
#
|
||||
# stylesheet_link_tag "style"
|
||||
|
@ -88,7 +86,6 @@ module ActionView
|
|||
# stylesheet_link_tag "random.styles", "/css/stylish"
|
||||
# # => <link href="/assets/random.styles" media="screen" rel="stylesheet" />
|
||||
# # <link href="/css/stylish.css" media="screen" rel="stylesheet" />
|
||||
#
|
||||
def stylesheet_link_tag(*sources)
|
||||
options = sources.extract_options!.stringify_keys
|
||||
path_options = options.extract!('protocol').symbolize_keys
|
||||
|
@ -109,10 +106,13 @@ module ActionView
|
|||
# +url_options+. You can modify the LINK tag itself in +tag_options+.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:rel</tt> - Specify the relation of this link, defaults to "alternate"
|
||||
# * <tt>:type</tt> - Override the auto-generated mime type
|
||||
# * <tt>:title</tt> - Specify the title of the link, defaults to the +type+
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# auto_discovery_link_tag
|
||||
# # => <link rel="alternate" type="application/rss+xml" title="RSS" href="http://www.currenthost.com/controller/action" />
|
||||
# auto_discovery_link_tag(:atom)
|
||||
|
@ -148,9 +148,12 @@ module ActionView
|
|||
# you can override "rel" and "type".
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:rel</tt> - Specify the relation of this link, defaults to 'shortcut icon'
|
||||
# * <tt>:type</tt> - Override the auto-generated mime type, defaults to 'image/vnd.microsoft.icon'
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# favicon_link_tag '/myicon.ico'
|
||||
# # => <link href="/assets/favicon.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
|
||||
#
|
||||
|
@ -160,7 +163,6 @@ module ActionView
|
|||
#
|
||||
# favicon_link_tag '/mb-icon.png', rel: 'apple-touch-icon', type: 'image/png'
|
||||
# # => <link href="/assets/mb-icon.png" rel="apple-touch-icon" type="image/png" />
|
||||
#
|
||||
def favicon_link_tag(source='favicon.ico', options={})
|
||||
tag('link', {
|
||||
:rel => 'shortcut icon',
|
||||
|
@ -173,6 +175,7 @@ module ActionView
|
|||
# path or a file.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# You can add HTML attributes using the +options+. The +options+ supports
|
||||
# three additional keys for convenience and conformance:
|
||||
#
|
||||
|
@ -250,6 +253,8 @@ module ActionView
|
|||
# width="30" and height="45". <tt>:size</tt> will be ignored if the
|
||||
# value is not in the correct format.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# video_tag("trailer")
|
||||
# # => <video src="/videos/trailer" />
|
||||
# video_tag("trailer.ogg")
|
||||
|
|
|
@ -28,6 +28,8 @@ module ActionView
|
|||
# Formats a +number+ into a US phone number (e.g., (555)
|
||||
# 123-9876). You can customize the format in the +options+ hash.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:area_code</tt> - Adds parentheses around the area code.
|
||||
# * <tt>:delimiter</tt> - Specifies the delimiter to use
|
||||
# (defaults to "-").
|
||||
|
@ -38,6 +40,8 @@ module ActionView
|
|||
# * <tt>:raise</tt> - If true, raises +InvalidNumberError+ when
|
||||
# the argument is invalid.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# number_to_phone(5551234) # => 555-1234
|
||||
# number_to_phone("5551234") # => 555-1234
|
||||
# number_to_phone(1235551234) # => 123-555-1234
|
||||
|
@ -61,6 +65,8 @@ module ActionView
|
|||
# Formats a +number+ into a currency string (e.g., $13.65). You
|
||||
# can customize the format in the +options+ hash.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:locale</tt> - Sets the locale to be used for formatting
|
||||
# (defaults to current locale).
|
||||
# * <tt>:precision</tt> - Sets the level of precision (defaults
|
||||
|
@ -82,6 +88,8 @@ module ActionView
|
|||
# * <tt>:raise</tt> - If true, raises +InvalidNumberError+ when
|
||||
# the argument is invalid.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# number_to_currency(1234567890.50) # => $1,234,567,890.50
|
||||
# number_to_currency(1234567890.506) # => $1,234,567,890.51
|
||||
# number_to_currency(1234567890.506, precision: 3) # => $1,234,567,890.506
|
||||
|
@ -108,6 +116,7 @@ module ActionView
|
|||
# Formats a +number+ as a percentage string (e.g., 65%). You can
|
||||
# customize the format in the +options+ hash.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:locale</tt> - Sets the locale to be used for formatting
|
||||
# (defaults to current locale).
|
||||
|
@ -128,6 +137,8 @@ module ActionView
|
|||
# * <tt>:raise</tt> - If true, raises +InvalidNumberError+ when
|
||||
# the argument is invalid.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# number_to_percentage(100) # => 100.000%
|
||||
# number_to_percentage("98") # => 98.000%
|
||||
# number_to_percentage(100, precision: 0) # => 100%
|
||||
|
@ -151,6 +162,8 @@ module ActionView
|
|||
# (e.g., 12,324). You can customize the format in the +options+
|
||||
# hash.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:locale</tt> - Sets the locale to be used for formatting
|
||||
# (defaults to current locale).
|
||||
# * <tt>:delimiter</tt> - Sets the thousands delimiter (defaults
|
||||
|
@ -160,6 +173,8 @@ module ActionView
|
|||
# * <tt>:raise</tt> - If true, raises +InvalidNumberError+ when
|
||||
# the argument is invalid.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# number_with_delimiter(12345678) # => 12,345,678
|
||||
# number_with_delimiter("123456") # => 123,456
|
||||
# number_with_delimiter(12345678.05) # => 12,345,678.05
|
||||
|
@ -185,6 +200,8 @@ module ActionView
|
|||
# +:significant+ is +false+, and 5 if +:significant+ is +true+).
|
||||
# You can customize the format in the +options+ hash.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:locale</tt> - Sets the locale to be used for formatting
|
||||
# (defaults to current locale).
|
||||
# * <tt>:precision</tt> - Sets the precision of the number
|
||||
|
@ -202,6 +219,8 @@ module ActionView
|
|||
# * <tt>:raise</tt> - If true, raises +InvalidNumberError+ when
|
||||
# the argument is invalid.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# number_with_precision(111.2345) # => 111.235
|
||||
# number_with_precision(111.2345, precision: 2) # => 111.23
|
||||
# number_with_precision(13, precision: 5) # => 13.00000
|
||||
|
@ -233,6 +252,8 @@ module ActionView
|
|||
# See <tt>number_to_human</tt> if you want to pretty-print a
|
||||
# generic number.
|
||||
#
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:locale</tt> - Sets the locale to be used for formatting
|
||||
# (defaults to current locale).
|
||||
# * <tt>:precision</tt> - Sets the precision of the number
|
||||
|
@ -252,6 +273,8 @@ module ActionView
|
|||
# * <tt>:raise</tt> - If true, raises +InvalidNumberError+ when
|
||||
# the argument is invalid.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# number_to_human_size(123) # => 123 Bytes
|
||||
# number_to_human_size(1234) # => 1.21 KB
|
||||
# number_to_human_size(12345) # => 12.1 KB
|
||||
|
@ -324,6 +347,8 @@ module ActionView
|
|||
# * <tt>:raise</tt> - If true, raises +InvalidNumberError+ when
|
||||
# the argument is invalid.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# number_to_human(123) # => "123"
|
||||
# number_to_human(1234) # => "1.23 Thousand"
|
||||
# number_to_human(12345) # => "12.3 Thousand"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class Base # :nodoc:
|
||||
include Helpers::ActiveModelInstanceTag, Helpers::TagHelper, Helpers::FormTagHelper
|
||||
include FormOptionsHelper
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'action_view/helpers/tags/checkable'
|
|||
|
||||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
module Tags # :nodoc:
|
||||
class CheckBox < Base #:nodoc:
|
||||
include Checkable
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
module Checkable
|
||||
module Tags # :nodoc:
|
||||
module Checkable # :nodoc:
|
||||
def input_checked?(object, options)
|
||||
if options.has_key?("checked")
|
||||
checked = options.delete "checked"
|
||||
|
|
|
@ -2,11 +2,11 @@ require 'action_view/helpers/tags/collection_helpers'
|
|||
|
||||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class CollectionCheckBoxes < Base
|
||||
module Tags # :nodoc:
|
||||
class CollectionCheckBoxes < Base # :nodoc:
|
||||
include CollectionHelpers
|
||||
|
||||
class CheckBoxBuilder < Builder
|
||||
class CheckBoxBuilder < Builder # :nodoc:
|
||||
def check_box(extra_html_options={})
|
||||
html_options = extra_html_options.merge(@input_html_options)
|
||||
@template_object.check_box(@object_name, @method_name, html_options, @value, nil)
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
module CollectionHelpers
|
||||
class Builder
|
||||
module Tags # :nodoc:
|
||||
module CollectionHelpers # :nodoc:
|
||||
class Builder # :nodoc:
|
||||
attr_reader :object, :text, :value
|
||||
|
||||
def initialize(template_object, object_name, method_name, object,
|
||||
|
|
|
@ -2,11 +2,11 @@ require 'action_view/helpers/tags/collection_helpers'
|
|||
|
||||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class CollectionRadioButtons < Base
|
||||
module Tags # :nodoc:
|
||||
class CollectionRadioButtons < Base # :nodoc:
|
||||
include CollectionHelpers
|
||||
|
||||
class RadioButtonBuilder < Builder
|
||||
class RadioButtonBuilder < Builder # :nodoc:
|
||||
def radio_button(extra_html_options={})
|
||||
html_options = extra_html_options.merge(@input_html_options)
|
||||
@template_object.radio_button(@object_name, @method_name, @value, html_options)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
module Tags # :nodoc:
|
||||
class CollectionSelect < Base #:nodoc:
|
||||
def initialize(object_name, method_name, template_object, collection, value_method, text_method, options, html_options)
|
||||
@collection = collection
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class ColorField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class ColorField < TextField # :nodoc:
|
||||
def render
|
||||
options = @options.stringify_keys
|
||||
options["value"] = @options.fetch("value") { validate_color_string(value(object)) }
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class DateField < DatetimeField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class DateField < DatetimeField # :nodoc:
|
||||
private
|
||||
|
||||
def format_date(value)
|
||||
|
|
|
@ -2,8 +2,8 @@ require 'active_support/core_ext/time/calculations'
|
|||
|
||||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class DateSelect < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class DateSelect < Base # :nodoc:
|
||||
def initialize(object_name, method_name, template_object, options, html_options)
|
||||
@html_options = html_options
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class DatetimeField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class DatetimeField < TextField # :nodoc:
|
||||
def render
|
||||
options = @options.stringify_keys
|
||||
options["value"] = @options.fetch("value") { format_date(value(object)) }
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class DatetimeLocalField < DatetimeField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class DatetimeLocalField < DatetimeField # :nodoc:
|
||||
class << self
|
||||
def field_type
|
||||
@field_type ||= "datetime-local"
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class DatetimeSelect < DateSelect #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class DatetimeSelect < DateSelect # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class EmailField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class EmailField < TextField # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class FileField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class FileField < TextField # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class GroupedCollectionSelect < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class GroupedCollectionSelect < Base # :nodoc:
|
||||
def initialize(object_name, method_name, template_object, collection, group_method, group_label_method, option_key_method, option_value_method, options, html_options)
|
||||
@collection = collection
|
||||
@group_method = group_method
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class HiddenField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class HiddenField < TextField # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class Label < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class Label < Base # :nodoc:
|
||||
def initialize(object_name, method_name, template_object, content_or_options = nil, options = nil)
|
||||
options ||= {}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class MonthField < DatetimeField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class MonthField < DatetimeField # :nodoc:
|
||||
private
|
||||
|
||||
def format_date(value)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class NumberField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class NumberField < TextField # :nodoc:
|
||||
def render
|
||||
options = @options.stringify_keys
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class PasswordField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class PasswordField < TextField # :nodoc:
|
||||
def render
|
||||
@options = {:value => nil}.merge!(@options)
|
||||
super
|
||||
|
|
|
@ -2,8 +2,8 @@ require 'action_view/helpers/tags/checkable'
|
|||
|
||||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class RadioButton < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class RadioButton < Base # :nodoc:
|
||||
include Checkable
|
||||
|
||||
def initialize(object_name, method_name, template_object, tag_value, options)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class RangeField < NumberField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class RangeField < NumberField # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class SearchField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class SearchField < TextField # :nodoc:
|
||||
def render
|
||||
options = @options.stringify_keys
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class Select < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class Select < Base # :nodoc:
|
||||
def initialize(object_name, method_name, template_object, choices, options, html_options)
|
||||
@choices = choices
|
||||
@choices = @choices.to_a if @choices.is_a?(Range)
|
||||
|
@ -31,7 +31,6 @@ module ActionView
|
|||
#
|
||||
# [nil, []]
|
||||
# { nil => [] }
|
||||
#
|
||||
def grouped_choices?
|
||||
!@choices.empty? && @choices.first.respond_to?(:last) && Array === @choices.first.last
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class TelField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class TelField < TextField # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class TextArea < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class TextArea < Base # :nodoc:
|
||||
def render
|
||||
options = @options.stringify_keys
|
||||
add_default_name_and_id(options)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class TextField < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class TextField < Base # :nodoc:
|
||||
def render
|
||||
options = @options.stringify_keys
|
||||
options["size"] = options["maxlength"] unless options.key?("size")
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class TimeField < DatetimeField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class TimeField < DatetimeField # :nodoc:
|
||||
private
|
||||
|
||||
def format_date(value)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class TimeSelect < DateSelect #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class TimeSelect < DateSelect # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class TimeZoneSelect < Base #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class TimeZoneSelect < Base # :nodoc:
|
||||
def initialize(object_name, method_name, template_object, priority_zones, options, html_options)
|
||||
@priority_zones = priority_zones
|
||||
@html_options = html_options
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class UrlField < TextField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class UrlField < TextField # :nodoc:
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActionView
|
||||
module Helpers
|
||||
module Tags
|
||||
class WeekField < DatetimeField #:nodoc:
|
||||
module Tags # :nodoc:
|
||||
class WeekField < DatetimeField # :nodoc:
|
||||
private
|
||||
|
||||
def format_date(value)
|
||||
|
|
|
@ -126,8 +126,8 @@ module ActionView
|
|||
# Extracts an excerpt from +text+ that matches the first instance of +phrase+.
|
||||
# The <tt>:radius</tt> option expands the excerpt on each side of the first occurrence of +phrase+ by the number of characters
|
||||
# defined in <tt>:radius</tt> (which defaults to 100). If the excerpt radius overflows the beginning or end of the +text+,
|
||||
# then the <tt>:omission</tt> option (which defaults to "...") will be prepended/appended accordingly. The
|
||||
# <tt>:separator</tt> enable to choose the delimation. The resulting string will be stripped in any case. If the +phrase+
|
||||
# then the <tt>:omission</tt> option (which defaults to "...") will be prepended/appended accordingly. Use the
|
||||
# <tt>:separator</tt> option to choose the delimitation. The resulting string will be stripped in any case. If the +phrase+
|
||||
# isn't found, nil is returned.
|
||||
#
|
||||
# excerpt('This is an example', 'an', radius: 5)
|
||||
|
@ -145,7 +145,7 @@ module ActionView
|
|||
# excerpt('This is also an example', 'an', radius: 8, omission: '<chop> ')
|
||||
# # => <chop> is also an example
|
||||
#
|
||||
# excerpt('This is a very beautiful morning', 'very', separator: ' ', radius: 1)
|
||||
# excerpt('This is a very beautiful morning', 'very', separator: ' ', radius: 1)
|
||||
# # => ...a very beautiful...
|
||||
def excerpt(text, phrase, options = {})
|
||||
return unless text && phrase
|
||||
|
@ -250,8 +250,11 @@ module ActionView
|
|||
# simple_format("Look ma! A class!", class: 'description')
|
||||
# # => "<p class='description'>Look ma! A class!</p>"
|
||||
#
|
||||
# simple_format("<span>I'm allowed!</span> It's true.", {}, sanitize: false)
|
||||
# # => "<p><span>I'm allowed!</span> It's true.</p>"
|
||||
# simple_format("<blink>Unblinkable.</blink>")
|
||||
# # => "<p>Unblinkable.</p>"
|
||||
#
|
||||
# simple_format("<blink>Blinkable!</blink> It's true.", {}, sanitize: false)
|
||||
# # => "<p><blink>Blinkable!</span> It's true.</p>"
|
||||
def simple_format(text, html_options = {}, options = {})
|
||||
wrapper_tag = options.fetch(:wrapper_tag, :p)
|
||||
|
||||
|
|
|
@ -30,7 +30,7 @@ module ActiveRecord
|
|||
reset_scope
|
||||
end
|
||||
|
||||
# Returns the name of the table of the related class:
|
||||
# Returns the name of the table of the associated class:
|
||||
#
|
||||
# post.comments.aliased_table_name # => "comments"
|
||||
#
|
||||
|
|
|
@ -92,7 +92,7 @@ module ActiveRecord
|
|||
# # => ActiveModel::MissingAttributeError: missing attribute: person_id
|
||||
#
|
||||
# *Second:* You can pass a block so it can be used just like Array#select.
|
||||
# This build an array of objects from the database for the scope,
|
||||
# This builds an array of objects from the database for the scope,
|
||||
# converting them into an array and iterating through them using
|
||||
# Array#select.
|
||||
#
|
||||
|
@ -304,7 +304,7 @@ module ActiveRecord
|
|||
@association.concat(*records)
|
||||
end
|
||||
|
||||
# Replace this collection with +other_array+. This will perform a diff
|
||||
# Replaces this collection with +other_array+. This will perform a diff
|
||||
# and delete/add only records that have changed.
|
||||
#
|
||||
# class Person < ActiveRecord::Base
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module ActiveRecord
|
||||
module Associations
|
||||
class JoinDependency # :nodoc:
|
||||
# A JoinPart represents a part of a JoinDependency. It is an abstract class, inherited
|
||||
# A JoinPart represents a part of a JoinDependency. It is inherited
|
||||
# by JoinBase and JoinAssociation. A JoinBase represents the Active Record which
|
||||
# everything else is being joined onto. A JoinAssociation represents an association which
|
||||
# is joining to the base. A JoinAssociation may result in more than one actual join
|
||||
|
|
|
@ -11,6 +11,12 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
module ClassMethods
|
||||
##
|
||||
# :method: serialized_attributes
|
||||
#
|
||||
# Returns a hash of all the attributes that have been specified for
|
||||
# serialization as keys and their class restriction as values.
|
||||
|
||||
# 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
|
||||
|
@ -44,6 +50,7 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
# *DEPRECATED*: Use ActiveRecord::AttributeMethods::Serialization::ClassMethods#serialized_attributes class level method instead.
|
||||
def serialized_attributes
|
||||
message = "Instance level serialized_attributes method is deprecated, please use class level method."
|
||||
ActiveSupport::Deprecation.warn message
|
||||
|
|
|
@ -466,7 +466,7 @@ module ActiveRecord
|
|||
@connection.respond_to?(:reverting) && @connection.reverting
|
||||
end
|
||||
|
||||
class ReversibleBlockHelper < Struct.new(:reverting)
|
||||
class ReversibleBlockHelper < Struct.new(:reverting) # :nodoc:
|
||||
def up
|
||||
yield unless reverting
|
||||
end
|
||||
|
|
|
@ -75,8 +75,13 @@ module ActiveRecord
|
|||
end
|
||||
end
|
||||
|
||||
# Abstract base class for AggregateReflection and AssociationReflection. Objects of
|
||||
# Base class for AggregateReflection and AssociationReflection. Objects of
|
||||
# AggregateReflection and AssociationReflection are returned by the Reflection::ClassMethods.
|
||||
#
|
||||
# MacroReflection
|
||||
# AggregateReflection
|
||||
# AssociationReflection
|
||||
# ThroughReflection
|
||||
class MacroReflection
|
||||
# Returns the name of the macro.
|
||||
#
|
||||
|
|
|
@ -34,7 +34,6 @@ module ActiveRecord
|
|||
#
|
||||
# User.where.not(name: "Jon", role: "admin")
|
||||
# # SELECT * FROM users WHERE name != 'Jon' AND role != 'admin'
|
||||
#
|
||||
def not(opts, *rest)
|
||||
where_value = @scope.send(:build_where, opts, rest).map do |rel|
|
||||
case rel
|
||||
|
@ -353,7 +352,7 @@ module ActiveRecord
|
|||
spawn.unscope!(*args)
|
||||
end
|
||||
|
||||
def unscope!(*args)
|
||||
def unscope!(*args) # :nodoc:
|
||||
args.flatten!
|
||||
|
||||
args.each do |scope|
|
||||
|
|
|
@ -93,7 +93,7 @@
|
|||
|
||||
* Improve `String#squish` to handle Unicode whitespace. *Antoine Lyset*
|
||||
|
||||
* Standardize on `to_time` returning an instance of `Time` in the local system timezone
|
||||
* Standardise on `to_time` returning an instance of `Time` in the local system timezone
|
||||
across `String`, `Time`, `Date`, `DateTime` and `ActiveSupport::TimeWithZone`.
|
||||
|
||||
*Andrew White*
|
||||
|
@ -159,7 +159,7 @@
|
|||
|
||||
* Remove surrogate unicode character encoding from `ActiveSupport::JSON.encode`
|
||||
The encoding scheme was broken for unicode characters outside the basic multilingual plane;
|
||||
since JSON is assumed to be UTF-8, and we already force the encoding to UTF-8,
|
||||
since json is assumed to be UTF-8, and we already force the encoding to UTF-8,
|
||||
simply pass through the un-encoded characters.
|
||||
|
||||
*Brett Carter*
|
||||
|
@ -378,7 +378,7 @@
|
|||
|
||||
* An optional block can be passed to `HashWithIndifferentAccess#update` and `#merge`.
|
||||
The block will be invoked for each duplicated key, and used to resolve the conflict,
|
||||
thus replicating the behavior of the corresponding methods on the `Hash` class.
|
||||
thus replicating the behaviour of the corresponding methods on the `Hash` class.
|
||||
|
||||
*Leo Cassarani*
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ class Array
|
|||
# pass an option key that doesn't exist in the list below, it will raise an
|
||||
# <tt>ArgumentError</tt>.
|
||||
#
|
||||
# Options:
|
||||
# ==== Options
|
||||
#
|
||||
# * <tt>:words_connector</tt> - The sign or word used to join the elements
|
||||
# in arrays with two or more elements (default: ", ").
|
||||
|
@ -24,6 +24,8 @@ class Array
|
|||
# the connector options defined on the 'support.array' namespace in the
|
||||
# corresponding dictionary file.
|
||||
#
|
||||
# ==== Examples
|
||||
#
|
||||
# [].to_sentence # => ""
|
||||
# ['one'].to_sentence # => "one"
|
||||
# ['one', 'two'].to_sentence # => "one and two"
|
||||
|
@ -38,10 +40,10 @@ class Array
|
|||
# ['one', 'two', 'three'].to_sentence(words_connector: ' or ', last_word_connector: ' or at least ')
|
||||
# # => "one or two or at least three"
|
||||
#
|
||||
# Examples using <tt>:locale</tt> option:
|
||||
# Using <tt>:locale</tt> option:
|
||||
#
|
||||
# # Given this locale dictionary:
|
||||
# #
|
||||
# #
|
||||
# # es:
|
||||
# # support:
|
||||
# # array:
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
class Array
|
||||
# *DEPRECATED*: Use +Array#uniq+ instead.
|
||||
# *DEPRECATED*: Use <tt>Array#uniq</tt> instead.
|
||||
#
|
||||
# Returns a unique array based on the criteria in the block.
|
||||
#
|
||||
|
@ -9,7 +9,7 @@ class Array
|
|||
uniq(&block)
|
||||
end
|
||||
|
||||
# *DEPRECATED*: Use +Array#uniq!+ instead.
|
||||
# *DEPRECATED*: Use <tt>Array#uniq!</tt> instead.
|
||||
#
|
||||
# Same as +uniq_by+, but modifies +self+.
|
||||
def uniq_by!(&block)
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
require 'benchmark'
|
||||
|
||||
class << Benchmark
|
||||
# Benchmark realtime in milliseconds.
|
||||
#
|
||||
# Benchmark.realtime { User.all }
|
||||
# # => 8.0e-05
|
||||
#
|
||||
# Benchmark.ms { User.all }
|
||||
# # => 0.074
|
||||
def ms
|
||||
1000 * realtime { yield }
|
||||
end
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 17 KiB |
|
@ -113,7 +113,7 @@ Please refer to the [Changelog](https://github.com/rails/rails/blob/master/activ
|
|||
|
||||
* Add `ActiveModel::ForbiddenAttributesProtection`, a simple module to protect attributes from mass assignment when non-permitted attributes are passed.
|
||||
|
||||
* Added `ActiveModel::Model`, a mixin to make Ruby objects work with AP out of box.
|
||||
* Added `ActiveModel::Model`, a mixin to make Ruby objects work with ActionPack out of box.
|
||||
|
||||
### Deprecations
|
||||
|
||||
|
|
|
@ -27,6 +27,16 @@ A controller can thus be thought of as a middle man between models and views. It
|
|||
|
||||
NOTE: For more details on the routing process, see [Rails Routing from the Outside In](routing.html).
|
||||
|
||||
Controller Naming Convention
|
||||
----------------------------
|
||||
|
||||
The naming convention of controllers in Rails favors pluralization of the last word in the controller's name, although it is not strictly required (e.g. `ApplicationController`). For example, `ClientsController` is preferable to `ClientController`, `SiteAdminsController` is preferable to `SiteAdminController` or `SitesAdminsController`, and so on.
|
||||
|
||||
Following this convention will allow you to use the default route generators (e.g. `resources`, etc) without needing to qualify each `:path` or `:controller`, and keeps URL and path helpers' usage consistent throughout your application. See [Layouts & Rendering Guide](layouts_and_rendering.html) for more details.
|
||||
|
||||
NOTE: The controller naming convention differs from the naming convention of models, which expected to be named in singular form.
|
||||
|
||||
|
||||
Methods and Actions
|
||||
-------------------
|
||||
|
||||
|
@ -561,7 +571,7 @@ Note that while for session values you set the key to `nil`, to delete a cookie
|
|||
Rendering xml and json data
|
||||
---------------------------
|
||||
|
||||
ActionController makes it extremely easy to render `xml` or `json` data. If you generate a controller using scaffolding then it would look something like this:
|
||||
ActionController makes it extremely easy to render `xml` or `json` data. If you've generated a controller using scaffolding, it would look something like this:
|
||||
|
||||
```ruby
|
||||
class UsersController < ApplicationController
|
||||
|
@ -576,7 +586,7 @@ class UsersController < ApplicationController
|
|||
end
|
||||
```
|
||||
|
||||
Notice that in the above case code is `render xml: @users` and not `render xml: @users.to_xml`. That is because if the input is not string then rails automatically invokes `to_xml` .
|
||||
You may notice in the above code that we're using `render xml: @users`, not `render xml: @users.to_xml`. If the object is not a String, then Rails will automatically invoke `to_xml` for us.
|
||||
|
||||
Filters
|
||||
-------
|
||||
|
@ -599,15 +609,6 @@ class ApplicationController < ActionController::Base
|
|||
redirect_to new_login_url # halts request cycle
|
||||
end
|
||||
end
|
||||
|
||||
# The logged_in? method simply returns true if the user is logged
|
||||
# in and false otherwise. It does this by "booleanizing" the
|
||||
# current_user method we created previously using a double ! operator.
|
||||
# Note that this is not common in Ruby and is discouraged unless you
|
||||
# really mean to convert something into true or false.
|
||||
def logged_in?
|
||||
!!current_user
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
|
@ -788,7 +789,7 @@ Rails comes with two built-in HTTP authentication mechanisms:
|
|||
HTTP basic authentication is an authentication scheme that is supported by the majority of browsers and other HTTP clients. As an example, consider an administration section which will only be available by entering a username and a password into the browser's HTTP basic dialog window. Using the built-in authentication is quite easy and only requires you to use one method, `http_basic_authenticate_with`.
|
||||
|
||||
```ruby
|
||||
class AdminController < ApplicationController
|
||||
class AdminsController < ApplicationController
|
||||
http_basic_authenticate_with name: "humbaba", password: "5baa61e4"
|
||||
end
|
||||
```
|
||||
|
@ -800,7 +801,7 @@ With this in place, you can create namespaced controllers that inherit from `Adm
|
|||
HTTP digest authentication is superior to the basic authentication as it does not require the client to send an unencrypted password over the network (though HTTP basic authentication is safe over HTTPS). Using digest authentication with Rails is quite easy and only requires using one method, `authenticate_or_request_with_http_digest`.
|
||||
|
||||
```ruby
|
||||
class AdminController < ApplicationController
|
||||
class AdminsController < ApplicationController
|
||||
USERS = { "lifo" => "world" }
|
||||
|
||||
before_action :authenticate
|
||||
|
|
|
@ -17,10 +17,7 @@ After reading this guide, you will know:
|
|||
Introduction
|
||||
------------
|
||||
|
||||
Action Mailer allows you to send emails from your application using a mailer
|
||||
model and views. So, in Rails, emails are used by creating mailers that inherit
|
||||
from `ActionMailer::Base` and live in `app/mailers`. Those mailers have
|
||||
associated views that appear alongside controller views in `app/views`.
|
||||
Action Mailer allows you to send emails from your application using mailer classes and views. Mailers work very similarly to controllers. They inherit from `ActionMailer::Base` and live in `app/mailers`, and they have associated views that appear in `app/views`.
|
||||
|
||||
Sending Emails
|
||||
--------------
|
||||
|
@ -87,11 +84,8 @@ Here is a quick explanation of the items presented in the preceding method. For
|
|||
a full list of all available options, please have a look further down at the
|
||||
Complete List of Action Mailer user-settable attributes section.
|
||||
|
||||
* `default Hash` - This is a hash of default values for any email you send, in
|
||||
this case we are setting the `:from` header to a value for all messages in
|
||||
this class, this can be overridden on a per email basis
|
||||
* `mail` - The actual email message, we are passing the `:to` and `:subject`
|
||||
headers in.
|
||||
* `default Hash` - This is a hash of default values for any email you send from this mailer. In this case we are setting the `:from` header to a value for all messages in this class. This can be overridden on a per-email basis.
|
||||
* `mail` - The actual email message, we are passing the `:to` and `:subject` headers in.
|
||||
|
||||
Just like controllers, any instance variables we define in the method become
|
||||
available for use in the views.
|
||||
|
@ -149,7 +143,7 @@ controller tell the Mailer to send an email when a user is successfully created.
|
|||
|
||||
Setting this up is painfully simple.
|
||||
|
||||
First off, we need to create a simple `User` scaffold:
|
||||
First, let's create a simple `User` scaffold:
|
||||
|
||||
```bash
|
||||
$ rails generate scaffold user name email login
|
||||
|
@ -241,8 +235,9 @@ encoded and not try to Base64 encode it.
|
|||
|
||||
#### Making Inline Attachments
|
||||
|
||||
* Firstly, to tell Mail to turn an attachment into an inline attachment, you
|
||||
just call `#inline` on the attachments method within your Mailer:
|
||||
Action Mailer 3.0 makes inline attachments, which involved a lot of hacking in pre 3.0 versions, much simpler and trivial as they should be.
|
||||
|
||||
* First, to tell Mail to turn an attachment into an inline attachment, you just call `#inline` on the attachments method within your Mailer:
|
||||
|
||||
```ruby
|
||||
def welcome
|
||||
|
@ -296,7 +291,7 @@ The same format can be used to set carbon copy (Cc:) and blind carbon copy
|
|||
|
||||
Sometimes you wish to show the name of the person instead of just their email
|
||||
address when they receive the email. The trick to doing that is to format the
|
||||
email address in the format `"Name <email>"`.
|
||||
email address in the format `"Full Name <email>"`.
|
||||
|
||||
```ruby
|
||||
def welcome_email(user)
|
||||
|
@ -366,7 +361,7 @@ needs to be the same as your mailer, such as `user_mailer.html.erb` and
|
|||
`user_mailer.text.erb` to be automatically recognized by your mailer as a
|
||||
layout.
|
||||
|
||||
In order to use a different file just use:
|
||||
In order to use a different file, call `layout` in your mailer:
|
||||
|
||||
```ruby
|
||||
class UserMailer < ActionMailer::Base
|
||||
|
@ -677,7 +672,7 @@ config.action_mailer.smtp_settings = {
|
|||
Mailer Testing
|
||||
--------------
|
||||
|
||||
You can find detailed instructions on how to test your mailers in our
|
||||
You can find detailed instructions on how to test your mailers in the
|
||||
[testing guide](testing.html#testing-your-mailers).
|
||||
|
||||
Intercepting Emails
|
||||
|
|
|
@ -172,7 +172,7 @@ That code will pull in the partial from `app/views/shared/_menu.html.erb`.
|
|||
|
||||
#### Using Partials to simplify Views
|
||||
|
||||
One way to use partials is to treat them as the equivalent of subroutines: as a way to move details out of a view so that you can grasp what's going on more easily. For example, you might have a view that looked like this:
|
||||
One way to use partials is to treat them as the equivalent of subroutines; a way to move details out of a view so that you can grasp what's going on more easily. For example, you might have a view that looks like this:
|
||||
|
||||
```html+erb
|
||||
<%= render "shared/ad_banner" %>
|
||||
|
@ -269,12 +269,7 @@ Rails will render the `_product_ruler` partial (with no data passed to it) betwe
|
|||
|
||||
### Layouts
|
||||
|
||||
TODO...
|
||||
|
||||
Using Templates, Partials and Layouts "The Rails Way"
|
||||
--------------------------------------------------------
|
||||
|
||||
TODO...
|
||||
Layouts can be used to render a common view template around the results of Rails controller actions. Typically, every Rails has a couple of overall layouts that most pages are rendered within. For example, a site might have a layout for a logged in user, and a layout for the marketing or sales side of the site. The logged in user layout might include top-level navigation that should be present across many controller actions. The sales layout for a SaaS app might include top-level navigation for things like "Pricing" and "Contact Us." You would expect each layout to have a different look and feel. You can read more details about Layouts in the [Layouts and Rendering in Rails](layouts_and_rendering.html) guide.
|
||||
|
||||
Partial Layouts
|
||||
---------------
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
Active Record Basics
|
||||
====================
|
||||
|
||||
|
||||
This guide is an introduction to Active Record.
|
||||
|
||||
After reading this guide, you will know:
|
||||
|
||||
* What Object Relational Mapping and Active Record are and how they are used in
|
||||
* What Object Relational Mapping and Active Record are and how they are used in
|
||||
Rails.
|
||||
* How Active Record fits into the Model-View-Controller paradigm.
|
||||
* How to use Active Record models to manipulate data stored in a relational
|
||||
* How to use Active Record models to manipulate data stored in a relational
|
||||
database.
|
||||
* Active Record schema naming conventions.
|
||||
* The concepts of database migrations, validations and callbacks.
|
||||
|
@ -18,33 +18,34 @@ After reading this guide, you will know:
|
|||
What is Active Record?
|
||||
----------------------
|
||||
|
||||
Active Record is the M in [MVC](getting_started.html#the-mvc-architecture) - the
|
||||
model - which is the layer of the system responsible for representing business
|
||||
data and logic. Active Record facilitates the creation and use of business
|
||||
objects whose data requires persistent storage to a database. It is an
|
||||
implementation of the Active Record pattern which itself is a description of an
|
||||
Active Record is the M in [MVC](getting_started.html#the-mvc-architecture) - the
|
||||
model - which is the layer of the system responsible for representing business
|
||||
data and logic. Active Record facilitates the creation and use of business
|
||||
objects whose data requires persistent storage to a database. It is an
|
||||
implementation of the Active Record pattern which itself is a description of an
|
||||
Object Relational Mapping system.
|
||||
|
||||
### The Active Record Pattern
|
||||
|
||||
Active Record was described by Martin Fowler in his book _Patterns of Enterprise
|
||||
Application Architecture_. In Active Record, objects carry both persistent data
|
||||
and behavior which operates on that data. Active Record takes the opinion that
|
||||
ensuring data access logic is part of the object will educate users of that
|
||||
[Active Record was described by Martin Fowler](http://www.martinfowler.com/eaaCatalog/activeRecord.html)
|
||||
in his book _Patterns of Enterprise Application Architecture_. In
|
||||
Active Record, objects carry both persistent data and behavior which
|
||||
operates on that data. Active Record takes the opinion that ensuring
|
||||
data access logic is part of the object will educate users of that
|
||||
object on how to write to and read from the database.
|
||||
|
||||
### Object Relational Mapping
|
||||
|
||||
Object-Relational Mapping, commonly referred to as its abbreviation ORM, is
|
||||
a technique that connects the rich objects of an application to tables in
|
||||
a relational database management system. Using ORM, the properties and
|
||||
relationships of the objects in an application can be easily stored and
|
||||
retrieved from a database without writing SQL statements directly and with less
|
||||
Object-Relational Mapping, commonly referred to as its abbreviation ORM, is
|
||||
a technique that connects the rich objects of an application to tables in
|
||||
a relational database management system. Using ORM, the properties and
|
||||
relationships of the objects in an application can be easily stored and
|
||||
retrieved from a database without writing SQL statements directly and with less
|
||||
overall database access code.
|
||||
|
||||
### Active Record as an ORM Framework
|
||||
|
||||
Active Record gives us several mechanisms, the most important being the ability
|
||||
Active Record gives us several mechanisms, the most important being the ability
|
||||
to:
|
||||
|
||||
* Represent models and their data
|
||||
|
@ -56,29 +57,29 @@ to:
|
|||
Convention over Configuration in Active Record
|
||||
----------------------------------------------
|
||||
|
||||
When writing applications using other programming languages or frameworks, it
|
||||
may be necessary to write a lot of configuration code. This is particularly true
|
||||
for ORM frameworks in general. However, if you follow the conventions adopted by
|
||||
Rails, you'll need to write very little configuration (in some case no
|
||||
configuration at all) when creating Active Record models. The idea is that if
|
||||
you configure your applications in the very same way most of the times then this
|
||||
should be the default way. In this cases, explicit configuration would be needed
|
||||
When writing applications using other programming languages or frameworks, it
|
||||
may be necessary to write a lot of configuration code. This is particularly true
|
||||
for ORM frameworks in general. However, if you follow the conventions adopted by
|
||||
Rails, you'll need to write very little configuration (in some case no
|
||||
configuration at all) when creating Active Record models. The idea is that if
|
||||
you configure your applications in the very same way most of the times then this
|
||||
should be the default way. In this cases, explicit configuration would be needed
|
||||
only in those cases where you can't follow the conventions for any reason.
|
||||
|
||||
### Naming Conventions
|
||||
|
||||
By default, Active Record uses some naming conventions to find out how the
|
||||
mapping between models and database tables should be created. Rails will
|
||||
pluralize your class names to find the respective database table. So, for
|
||||
a class `Book`, you should have a database table called **books**. The Rails
|
||||
pluralization mechanisms are very powerful, being capable to pluralize (and
|
||||
singularize) both regular and irregular words. When using class names composed
|
||||
of two or more words, the model class name should follow the Ruby conventions,
|
||||
using the CamelCase form, while the table name must contain the words separated
|
||||
By default, Active Record uses some naming conventions to find out how the
|
||||
mapping between models and database tables should be created. Rails will
|
||||
pluralize your class names to find the respective database table. So, for
|
||||
a class `Book`, you should have a database table called **books**. The Rails
|
||||
pluralization mechanisms are very powerful, being capable to pluralize (and
|
||||
singularize) both regular and irregular words. When using class names composed
|
||||
of two or more words, the model class name should follow the Ruby conventions,
|
||||
using the CamelCase form, while the table name must contain the words separated
|
||||
by underscores. Examples:
|
||||
|
||||
* Database Table - Plural with underscores separating words (e.g., `book_clubs`)
|
||||
* Model Class - Singular with the first letter of each word capitalized (e.g.,
|
||||
* Model Class - Singular with the first letter of each word capitalized (e.g.,
|
||||
`BookClub`)
|
||||
|
||||
| Model / Class | Table / Schema |
|
||||
|
@ -92,33 +93,35 @@ by underscores. Examples:
|
|||
|
||||
### Schema Conventions
|
||||
|
||||
Active Record uses naming conventions for the columns in database tables,
|
||||
Active Record uses naming conventions for the columns in database tables,
|
||||
depending on the purpose of these columns.
|
||||
|
||||
* **Foreign keys** - These fields should be named following the pattern
|
||||
`singularized_table_name_id` (e.g., `item_id`, `order_id`). These are the
|
||||
fields that Active Record will look for when you create associations between
|
||||
* **Foreign keys** - These fields should be named following the pattern
|
||||
`singularized_table_name_id` (e.g., `item_id`, `order_id`). These are the
|
||||
fields that Active Record will look for when you create associations between
|
||||
your models.
|
||||
* **Primary keys** - By default, Active Record will use an integer column named
|
||||
`id` as the table's primary key. When using [Rails
|
||||
Migrations](migrations.html) to create your tables, this column will be
|
||||
* **Primary keys** - By default, Active Record will use an integer column named
|
||||
`id` as the table's primary key. When using [Rails
|
||||
Migrations](migrations.html) to create your tables, this column will be
|
||||
automatically created.
|
||||
|
||||
There are also some optional column names that will create additional features
|
||||
There are also some optional column names that will create additional features
|
||||
to Active Record instances:
|
||||
|
||||
* `created_at` - Automatically gets set to the current date and time when the
|
||||
* `created_at` - Automatically gets set to the current date and time when the
|
||||
record is first created.
|
||||
* `updated_at` - Automatically gets set to the current date and time whenever
|
||||
* `updated_at` - Automatically gets set to the current date and time whenever
|
||||
the record is updated.
|
||||
* `lock_version` - Adds [optimistic
|
||||
locking](http://api.rubyonrails.org/classes/ActiveRecord/Locking.html) to
|
||||
* `lock_version` - Adds [optimistic
|
||||
locking](http://api.rubyonrails.org/classes/ActiveRecord/Locking.html) to
|
||||
a model.
|
||||
* `type` - Specifies that the model uses [Single Table
|
||||
* `type` - Specifies that the model uses [Single Table
|
||||
Inheritance](http://api.rubyonrails.org/classes/ActiveRecord/Base.html)
|
||||
* `(table_name)_count` - Used to cache the number of belonging objects on
|
||||
associations. For example, a `comments_count` column in a `Post` class that
|
||||
has many instances of `Comment` will cache the number of existent comments
|
||||
* `(association_name)_type` - Stores the type for
|
||||
[polymorphic associations](association_basics.html#polymorphic-associations).
|
||||
* `(table_name)_count` - Used to cache the number of belonging objects on
|
||||
associations. For example, a `comments_count` column in a `Post` class that
|
||||
has many instances of `Comment` will cache the number of existent comments
|
||||
for each post.
|
||||
|
||||
NOTE: While these column names are optional, they are in fact reserved by Active Record. Steer clear of reserved keywords unless you want the extra functionality. For example, `type` is a reserved keyword used to designate a table using Single Table Inheritance (STI). If you are not using STI, try an analogous keyword like "context", that may still accurately describe the data you are modeling.
|
||||
|
@ -126,7 +129,7 @@ NOTE: While these column names are optional, they are in fact reserved by Active
|
|||
Creating Active Record Models
|
||||
-----------------------------
|
||||
|
||||
It is very easy to create Active Record models. All you have to do is to
|
||||
It is very easy to create Active Record models. All you have to do is to
|
||||
subclass the `ActiveRecord::Base` class and you're good to go:
|
||||
|
||||
```ruby
|
||||
|
@ -134,9 +137,9 @@ class Product < ActiveRecord::Base
|
|||
end
|
||||
```
|
||||
|
||||
This will create a `Product` model, mapped to a `products` table at the
|
||||
database. By doing this you'll also have the ability to map the columns of each
|
||||
row in that table with the attributes of the instances of your model. Suppose
|
||||
This will create a `Product` model, mapped to a `products` table at the
|
||||
database. By doing this you'll also have the ability to map the columns of each
|
||||
row in that table with the attributes of the instances of your model. Suppose
|
||||
that the `products` table was created using an SQL sentence like:
|
||||
|
||||
```sql
|
||||
|
@ -147,7 +150,7 @@ CREATE TABLE products (
|
|||
);
|
||||
```
|
||||
|
||||
Following the table schema above, you would be able to write code like the
|
||||
Following the table schema above, you would be able to write code like the
|
||||
following:
|
||||
|
||||
```ruby
|
||||
|
@ -159,11 +162,11 @@ puts p.name # "Some Book"
|
|||
Overriding the Naming Conventions
|
||||
---------------------------------
|
||||
|
||||
What if you need to follow a different naming convention or need to use your
|
||||
Rails application with a legacy database? No problem, you can easily override
|
||||
What if you need to follow a different naming convention or need to use your
|
||||
Rails application with a legacy database? No problem, you can easily override
|
||||
the default conventions.
|
||||
|
||||
You can use the `ActiveRecord::Base.table_name=` method to specify the table
|
||||
You can use the `ActiveRecord::Base.table_name=` method to specify the table
|
||||
name that should be used:
|
||||
|
||||
```ruby
|
||||
|
@ -172,8 +175,8 @@ class Product < ActiveRecord::Base
|
|||
end
|
||||
```
|
||||
|
||||
If you do so, you will have to define manually the class name that is hosting
|
||||
the fixtures (class_name.yml) using the `set_fixture_class` method in your test
|
||||
If you do so, you will have to define manually the class name that is hosting
|
||||
the fixtures (class_name.yml) using the `set_fixture_class` method in your test
|
||||
definition:
|
||||
|
||||
```ruby
|
||||
|
@ -184,7 +187,7 @@ class FunnyJoke < ActiveSupport::TestCase
|
|||
end
|
||||
```
|
||||
|
||||
It's also possible to override the column that should be used as the table's
|
||||
It's also possible to override the column that should be used as the table's
|
||||
primary key using the `ActiveRecord::Base.set_primary_key` method:
|
||||
|
||||
```ruby
|
||||
|
@ -196,17 +199,17 @@ end
|
|||
CRUD: Reading and Writing Data
|
||||
------------------------------
|
||||
|
||||
CRUD is an acronym for the four verbs we use to operate on data: **C**reate,
|
||||
**R**ead, **U**pdate and **D**elete. Active Record automatically creates methods
|
||||
CRUD is an acronym for the four verbs we use to operate on data: **C**reate,
|
||||
**R**ead, **U**pdate and **D**elete. Active Record automatically creates methods
|
||||
to allow an application to read and manipulate data stored within its tables.
|
||||
|
||||
### Create
|
||||
|
||||
Active Record objects can be created from a hash, a block or have their
|
||||
attributes manually set after creation. The `new` method will return a new
|
||||
Active Record objects can be created from a hash, a block or have their
|
||||
attributes manually set after creation. The `new` method will return a new
|
||||
object while `create` will return the object and save it to the database.
|
||||
|
||||
For example, given a model `User` with attributes of `name` and `occupation`,
|
||||
For example, given a model `User` with attributes of `name` and `occupation`,
|
||||
the `create` method call will create and save a new record into the database:
|
||||
|
||||
```ruby
|
||||
|
@ -223,7 +226,7 @@ user.occupation = "Code Artist"
|
|||
|
||||
A call to `user.save` will commit the record to the database.
|
||||
|
||||
Finally, if a block is provided, both `create` and `new` will yield the new
|
||||
Finally, if a block is provided, both `create` and `new` will yield the new
|
||||
object to that block for initialization:
|
||||
|
||||
```ruby
|
||||
|
@ -235,7 +238,7 @@ end
|
|||
|
||||
### Read
|
||||
|
||||
Active Record provides a rich API for accessing data within a database. Below
|
||||
Active Record provides a rich API for accessing data within a database. Below
|
||||
are a few examples of different data access methods provided by Active Record.
|
||||
|
||||
```ruby
|
||||
|
@ -258,12 +261,12 @@ david = User.find_by_name('David')
|
|||
users = User.where(name: 'David', occupation: 'Code Artist').order('created_at DESC')
|
||||
```
|
||||
|
||||
You can learn more about querying an Active Record model in the [Active Record
|
||||
You can learn more about querying an Active Record model in the [Active Record
|
||||
Query Interface](active_record_querying.html) guide.
|
||||
|
||||
### Update
|
||||
|
||||
Once an Active Record object has been retrieved, its attributes can be modified
|
||||
Once an Active Record object has been retrieved, its attributes can be modified
|
||||
and it can be saved to the database.
|
||||
|
||||
```ruby
|
||||
|
@ -272,7 +275,7 @@ user.name = 'Dave'
|
|||
user.save
|
||||
```
|
||||
|
||||
A shorthand for this is to use a hash mapping attribute names to the desired
|
||||
A shorthand for this is to use a hash mapping attribute names to the desired
|
||||
value, like so:
|
||||
|
||||
```ruby
|
||||
|
@ -280,8 +283,8 @@ user = User.find_by_name('David')
|
|||
user.update(name: 'Dave')
|
||||
```
|
||||
|
||||
This is most useful when updating several attributes at once. If, on the other
|
||||
hand, you'd like to update several records in bulk, you may find the
|
||||
This is most useful when updating several attributes at once. If, on the other
|
||||
hand, you'd like to update several records in bulk, you may find the
|
||||
`update_all` class method useful:
|
||||
|
||||
```ruby
|
||||
|
@ -290,7 +293,7 @@ User.update_all "max_login_attempts = 3, must_change_password = 'true'"
|
|||
|
||||
### Delete
|
||||
|
||||
Likewise, once retrieved an Active Record object can be destroyed which removes
|
||||
Likewise, once retrieved an Active Record object can be destroyed which removes
|
||||
it from the database.
|
||||
|
||||
```ruby
|
||||
|
@ -301,46 +304,46 @@ user.destroy
|
|||
Validations
|
||||
-----------
|
||||
|
||||
Active Record allows you to validate the state of a model before it gets written
|
||||
into the database. There are several methods that you can use to check your
|
||||
models and validate that an attribute value is not empty, is unique and not
|
||||
Active Record allows you to validate the state of a model before it gets written
|
||||
into the database. There are several methods that you can use to check your
|
||||
models and validate that an attribute value is not empty, is unique and not
|
||||
already in the database, follows a specific format and many more.
|
||||
|
||||
Validation is a very important issue to consider when persisting to database, so
|
||||
the methods `create`, `save` and `update` take it into account when
|
||||
running: they return `false` when validation fails and they didn't actually
|
||||
perform any operation on database. All of these have a bang counterpart (that
|
||||
is, `create!`, `save!` and `update!`), which are stricter in that
|
||||
they raise the exception `ActiveRecord::RecordInvalid` if validation fails.
|
||||
Validation is a very important issue to consider when persisting to database, so
|
||||
the methods `create`, `save` and `update` take it into account when
|
||||
running: they return `false` when validation fails and they didn't actually
|
||||
perform any operation on database. All of these have a bang counterpart (that
|
||||
is, `create!`, `save!` and `update!`), which are stricter in that
|
||||
they raise the exception `ActiveRecord::RecordInvalid` if validation fails.
|
||||
A quick example to illustrate:
|
||||
|
||||
```ruby
|
||||
class User < ActiveRecord::Base
|
||||
validates_presence_of :name
|
||||
validates :name, presence: true
|
||||
end
|
||||
|
||||
User.create # => false
|
||||
User.create! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank
|
||||
```
|
||||
|
||||
You can learn more about validations in the [Active Record Validations
|
||||
You can learn more about validations in the [Active Record Validations
|
||||
guide](active_record_validations.html).
|
||||
|
||||
Callbacks
|
||||
---------
|
||||
|
||||
Active Record callbacks allow you to attach code to certain events in the
|
||||
life-cycle of your models. This enables you to add behavior to your models by
|
||||
transparently executing code when those events occur, like when you create a new
|
||||
record, update it, destroy it and so on. You can learn more about callbacks in
|
||||
Active Record callbacks allow you to attach code to certain events in the
|
||||
life-cycle of your models. This enables you to add behavior to your models by
|
||||
transparently executing code when those events occur, like when you create a new
|
||||
record, update it, destroy it and so on. You can learn more about callbacks in
|
||||
the [Active Record Callbacks guide](active_record_callbacks.html).
|
||||
|
||||
Migrations
|
||||
----------
|
||||
|
||||
Rails provides a domain-specific language for managing a database schema called
|
||||
migrations. Migrations are stored in files which are executed against any
|
||||
database that Active Record support using `rake`. Here's a migration that
|
||||
Rails provides a domain-specific language for managing a database schema called
|
||||
migrations. Migrations are stored in files which are executed against any
|
||||
database that Active Record support using `rake`. Here's a migration that
|
||||
creates a table:
|
||||
|
||||
```ruby
|
||||
|
@ -361,10 +364,10 @@ class CreatePublications < ActiveRecord::Migration
|
|||
end
|
||||
```
|
||||
|
||||
Rails keeps track of which files have been committed to the database and
|
||||
Rails keeps track of which files have been committed to the database and
|
||||
provides rollback features. To actually create the table, you'd run `rake db:migrate`
|
||||
and to roll it back, `rake db:rollback`.
|
||||
|
||||
Note that the above code is database-agnostic: it will run in MySQL, postgresql,
|
||||
Oracle and others. You can learn more about migrations in the [Active Record
|
||||
Note that the above code is database-agnostic: it will run in MySQL, postgresql,
|
||||
Oracle and others. You can learn more about migrations in the [Active Record
|
||||
Migrations guide](migrations.html)
|
||||
|
|
|
@ -5,8 +5,8 @@ This guide will teach you what you need to know about avoiding that expensive ro
|
|||
|
||||
After reading this guide, you will know:
|
||||
|
||||
* Page, action, and fragment caching.
|
||||
* Sweepers.
|
||||
* Page and action caching (moved to separate gems as of Rails 4).
|
||||
* Fragment caching.
|
||||
* Alternative cache stores.
|
||||
* Conditional GET support.
|
||||
|
||||
|
|
|
@ -445,12 +445,12 @@ NOTE. When using specific annotations and custom annotations, the annotation nam
|
|||
By default, `rake notes` will look in the `app`, `config`, `lib`, `bin` and `test` directories. If you would like to search other directories, you can provide them as a comma separated list in an environment variable `SOURCE_ANNOTATION_DIRECTORIES`.
|
||||
|
||||
```bash
|
||||
$ export SOURCE_ANNOTATION_DIRECTORIES='rspec,vendor'
|
||||
$ export SOURCE_ANNOTATION_DIRECTORIES='spec,vendor'
|
||||
$ rake notes
|
||||
(in /home/foobar/commandsapp)
|
||||
app/models/user.rb:
|
||||
* [ 35] [FIXME] User should have a subscription at this point
|
||||
rspec/model/user_spec.rb:
|
||||
spec/models/user_spec.rb:
|
||||
* [122] [TODO] Verify the user that has a subscription works
|
||||
```
|
||||
|
||||
|
|
|
@ -268,7 +268,7 @@ config.middleware.delete "Rack::MethodOverride"
|
|||
|
||||
* `config.active_record.lock_optimistically` controls whether Active Record will use optimistic locking and is true by default.
|
||||
|
||||
* +config.active_record.cache_timestamp_format+ controls the format of the timestamp value in the cache key. Default is +:number+.
|
||||
* `config.active_record.cache_timestamp_format` controls the format of the timestamp value in the cache key. Default is `:number`.
|
||||
|
||||
The MySQL adapter adds one additional configuration option:
|
||||
|
||||
|
|
|
@ -28,7 +28,7 @@ Ruby on Rails Guides: Credits
|
|||
<h3 class="section">Rails Guides Authors</h3>
|
||||
|
||||
<%= author('Ryan Bigg', 'radar', 'radar.png') do %>
|
||||
Ryan Bigg works as a consultant at <a href="http://rubyx.com">RubyX</a> and has been working with Rails since 2006. He's co-authoring a book called <a href="http://manning.com/katz">Rails 3 in Action</a> and he's written many gems which can be seen on <a href="https://github.com/radar">his GitHub page</a> and he also tweets prolifically as <a href="http://twitter.com/ryanbigg">@ryanbigg</a>.
|
||||
Ryan Bigg works as the Community Manager at <a href="http://spreecommerce.com">Spree Commerce</a> and has been working with Rails since 2006. He's the author of <a href="https://leanpub.com/multi-tenancy-rails">Multi Tenancy With Rails</a> and co-author of <a href="http://manning.com/katz">Rails 3 in Action</a>. He's written many gems which can be seen on <a href="https://github.com/radar">his GitHub page</a> and he also tweets prolifically as <a href="http://twitter.com/ryanbigg">@ryanbigg</a>.
|
||||
<% end %>
|
||||
|
||||
<%= author('Oscar Del Ben', 'oscardelben', 'oscardelben.jpg') do %>
|
||||
|
|
|
@ -665,11 +665,8 @@ References
|
|||
|
||||
* [ruby-debug Homepage](http://bashdb.sourceforge.net/ruby-debug/home-page.html)
|
||||
* [debugger Homepage](https://github.com/cldwalker/debugger)
|
||||
* [Article: Debugging a Rails application with ruby-debug](http://www.sitepoint.com/article/debug-rails-app-ruby-debug/)
|
||||
* [ruby-debug Basics screencast](http://brian.maybeyoureinsane.net/blog/2007/05/07/ruby-debug-basics-screencast/)
|
||||
* [Article: Debugging a Rails application with ruby-debug](http://www.sitepoint.com/debug-rails-app-ruby-debug/)
|
||||
* [Ryan Bates' debugging ruby (revised) screencast](http://railscasts.com/episodes/54-debugging-ruby-revised)
|
||||
* [Ryan Bates' stack trace screencast](http://railscasts.com/episodes/24-the-stack-trace)
|
||||
* [Ryan Bates' logger screencast](http://railscasts.com/episodes/56-the-logger)
|
||||
* [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)
|
||||
|
|
|
@ -35,6 +35,11 @@
|
|||
-
|
||||
name: Views
|
||||
documents:
|
||||
-
|
||||
name: Action View Overview
|
||||
url: action_view_overview.html
|
||||
description: This guide provides an introduction to Action View and introduces a few of the more common view helpers.
|
||||
work_in_progress: true
|
||||
-
|
||||
name: Layouts and Rendering in Rails
|
||||
url: layouts_and_rendering.html
|
||||
|
|
|
@ -461,7 +461,7 @@ NOTE: Other engines, such as Devise, handle this a little differently by making
|
|||
The engine contains migrations for the `blorgh_posts` and `blorgh_comments` table which need to be created in the application's database so that the engine's models can query them correctly. To copy these migrations into the application use this command:
|
||||
|
||||
```bash
|
||||
$ rake blorgh:install:migrations
|
||||
$ rake blorgh_engine:install:migrations
|
||||
```
|
||||
|
||||
If you have multiple engines that need migrations copied over, use `railties:install:migrations` instead:
|
||||
|
@ -612,50 +612,50 @@ This section covers how to make the `User` class configurable, followed by gener
|
|||
|
||||
#### Setting configuration settings in the application
|
||||
|
||||
The next step is to make the class that represents a `User` in the application customizable for the engine. This is because, as explained before, that class may not always be `User`. To make this customizable, the engine will have a configuration setting called `user_class` that will be used to specify what the class representing users is inside the application.
|
||||
The next step is to make the class that represents a `User` in the application customizable for the engine. This is because, as explained before, that class may not always be `User`. To make this customizable, the engine will have a configuration setting called `author_class` that will be used to specify what the class representing users is inside the application.
|
||||
|
||||
To define this configuration setting, you should use a `mattr_accessor` inside the `Blorgh` module for the engine, located at `lib/blorgh.rb` inside the engine. Inside this module, put this line:
|
||||
|
||||
```ruby
|
||||
mattr_accessor :user_class
|
||||
mattr_accessor :author_class
|
||||
```
|
||||
|
||||
This method works like its brothers `attr_accessor` and `cattr_accessor`, but provides a setter and getter method on the module with the specified name. To use it, it must be referenced using `Blorgh.user_class`.
|
||||
This method works like its brothers `attr_accessor` and `cattr_accessor`, but provides a setter and getter method on the module with the specified name. To use it, it must be referenced using `Blorgh.author_class`.
|
||||
|
||||
The next step is switching the `Blorgh::Post` model over to this new setting. For the `belongs_to` association inside this model (`app/models/blorgh/post.rb`), it will now become this:
|
||||
|
||||
```ruby
|
||||
belongs_to :author, class_name: Blorgh.user_class
|
||||
belongs_to :author, class_name: Blorgh.author_class
|
||||
```
|
||||
|
||||
The `set_author` method also located in this class should also use this class:
|
||||
|
||||
```ruby
|
||||
self.author = Blorgh.user_class.constantize.find_or_create_by(name: author_name)
|
||||
self.author = Blorgh.author_class.constantize.find_or_create_by(name: author_name)
|
||||
```
|
||||
|
||||
To save having to call `constantize` on the `user_class` result all the time, you could instead just override the `user_class` getter method inside the `Blorgh` module in the `lib/blorgh.rb` file to always call `constantize` on the saved value before returning the result:
|
||||
To save having to call `constantize` on the `author_class` result all the time, you could instead just override the `author_class` getter method inside the `Blorgh` module in the `lib/blorgh.rb` file to always call `constantize` on the saved value before returning the result:
|
||||
|
||||
```ruby
|
||||
def self.user_class
|
||||
@@user_class.constantize
|
||||
def self.author_class
|
||||
@@author_class.constantize
|
||||
end
|
||||
```
|
||||
|
||||
This would then turn the above code for `set_author` into this:
|
||||
|
||||
```ruby
|
||||
self.author = Blorgh.user_class.find_or_create_by(name: author_name)
|
||||
self.author = Blorgh.author_class.find_or_create_by(name: author_name)
|
||||
```
|
||||
|
||||
Resulting in something a little shorter, and more implicit in its behavior. The `user_class` method should always return a `Class` object.
|
||||
Resulting in something a little shorter, and more implicit in its behavior. The `author_class` method should always return a `Class` object.
|
||||
|
||||
Since we changed the `user_class` method to no longer return a
|
||||
Since we changed the `author_class` method to no longer return a
|
||||
`String` but a `Class` we must also modify our `belongs_to` definition
|
||||
in the `Blorgh::Post` model:
|
||||
|
||||
```ruby
|
||||
belongs_to :author, class_name: Blorgh.user_class.to_s
|
||||
belongs_to :author, class_name: Blorgh.author_class.to_s
|
||||
```
|
||||
|
||||
To set this configuration setting within the application, an initializer should be used. By using an initializer, the configuration will be set up before the application starts and calls the engine's models which may depend on this configuration setting existing.
|
||||
|
@ -663,7 +663,7 @@ To set this configuration setting within the application, an initializer should
|
|||
Create a new initializer at `config/initializers/blorgh.rb` inside the application where the `blorgh` engine is installed and put this content in it:
|
||||
|
||||
```ruby
|
||||
Blorgh.user_class = "User"
|
||||
Blorgh.author_class = "User"
|
||||
```
|
||||
|
||||
WARNING: It's very important here to use the `String` version of the class, rather than the class itself. If you were to use the class, Rails would attempt to load that class and then reference the related table, which could lead to problems if the table wasn't already existing. Therefore, a `String` should be used and then converted to a class using `constantize` in the engine later on.
|
||||
|
|
|
@ -221,7 +221,7 @@ Upon form submission the value entered by the user will be stored in `params[:pe
|
|||
|
||||
WARNING: You must pass the name of an instance variable, i.e. `:person` or `"person"`, not an actual instance of your model object.
|
||||
|
||||
Rails provides helpers for displaying the validation errors associated with a model object. These are covered in detail by the [Active Record Validations and Callbacks](./active_record_validations_callbacks.html#displaying-validation-errors-in-the-view) guide.
|
||||
Rails provides helpers for displaying the validation errors associated with a model object. These are covered in detail by the [Active Record Validations](./active_record_validations.html#displaying-validation-errors-in-views) guide.
|
||||
|
||||
### Binding a Form to an Object
|
||||
|
||||
|
@ -836,17 +836,14 @@ Active Record provides model level support via the `accepts_nested_attributes_f
|
|||
class Person < ActiveRecord::Base
|
||||
has_many :addresses
|
||||
accepts_nested_attributes_for :addresses
|
||||
|
||||
attr_accessible :name, :addresses_attributes
|
||||
end
|
||||
|
||||
class Address < ActiveRecord::Base
|
||||
belongs_to :person
|
||||
attr_accessible :kind, :street
|
||||
end
|
||||
```
|
||||
|
||||
This creates an `addresses_attributes=` method on `Person` that allows you to create, update and (optionally) destroy addresses. When using `attr_accessible` or `attr_protected` you must mark `addresses_attributes` as accessible as well as the other attributes of `Person` and `Address` that should be mass assigned.
|
||||
This creates an `addresses_attributes=` method on `Person` that allows you to create, update and (optionally) destroy addresses.
|
||||
|
||||
### Building the Form
|
||||
|
||||
|
|
|
@ -1043,7 +1043,7 @@ REST convention, so to create a new `Post` object it will look for a
|
|||
route named `posts_path`, and to update a `Post` object it will look for
|
||||
a route named `post_path` and pass the current object. Similarly, rails
|
||||
knows that it should create new objects via POST and update them via
|
||||
PUT.
|
||||
PATCH.
|
||||
|
||||
If you run `rake routes` from the console you'll see that we already
|
||||
have a `posts_path` route, which was created automatically by Rails when we
|
||||
|
@ -1054,13 +1054,13 @@ received an error before. With your server running you can view your routes by v
|
|||
```bash
|
||||
$ rake routes
|
||||
|
||||
posts GET /posts(.:format) posts#index
|
||||
posts_new GET /posts/new(.:format) posts#new
|
||||
POST /posts(.:format) posts#create
|
||||
GET /posts/:id(.:format) posts#show
|
||||
GET /posts/:id/edit(.:format) posts#edit
|
||||
PUT /posts/:id(.:format) posts#update
|
||||
root / welcome#index
|
||||
posts GET /posts(.:format) posts#index
|
||||
posts_new GET /posts/new(.:format) posts#new
|
||||
POST /posts(.:format) posts#create
|
||||
GET /posts/:id(.:format) posts#show
|
||||
GET /posts/:id/edit(.:format) posts#edit
|
||||
PATCH /posts/:id(.:format) posts#update
|
||||
root / welcome#index
|
||||
```
|
||||
|
||||
To fix this, open `config/routes.rb` and modify the `get "posts/:id"`
|
||||
|
@ -1197,6 +1197,7 @@ $ rake routes
|
|||
new_post GET /posts/new(.:format) posts#new
|
||||
edit_post GET /posts/:id/edit(.:format) posts#edit
|
||||
post GET /posts/:id(.:format) posts#show
|
||||
PATCH /posts/:id(.:format) posts#update
|
||||
PUT /posts/:id(.:format) posts#update
|
||||
DELETE /posts/:id(.:format) posts#destroy
|
||||
root / welcome#index
|
||||
|
|
|
@ -837,6 +837,28 @@ en:
|
|||
NOTE: In order to use this helper, you need to install [DynamicForm](https://github.com/joelmoss/dynamic_form)
|
||||
gem by adding this line to your Gemfile: `gem 'dynamic_form'`.
|
||||
|
||||
### Translations for Action Mailer E-Mail Subjects
|
||||
|
||||
If you don't pass a subject to the `mail` method, Action Mailer will try to find
|
||||
it in your translations. The performed lookup will use the pattern
|
||||
`<mailer_scope>.<action_name>.subject` to construct the key.
|
||||
|
||||
```ruby
|
||||
# user_mailer.rb
|
||||
class UserMailer < ActionMailer::Base
|
||||
def welcome(user)
|
||||
#...
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
```yaml
|
||||
en:
|
||||
user_mailer:
|
||||
welcome:
|
||||
subject: "Welcome to Rails Guides!"
|
||||
```
|
||||
|
||||
### 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.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Layouts and Rendering in Rails
|
||||
==============================
|
||||
|
||||
This guide covers the basic layout features of Action Controller and Action View. By referring to this guide, you will be able to:
|
||||
This guide covers the basic layout features of Action Controller and Action View.
|
||||
|
||||
After reading this guide, you will know:
|
||||
|
||||
|
@ -319,7 +319,62 @@ render status: 500
|
|||
render status: :forbidden
|
||||
```
|
||||
|
||||
Rails understands both numeric and symbolic status codes.
|
||||
Rails understands both numeric status codes and the corresponding symbols shown below:
|
||||
|
||||
| HTTP Status Code | Symbol |
|
||||
| ---------------- | -------------------------------- |
|
||||
| 100 | :continue |
|
||||
| 101 | :switching_protocols |
|
||||
| 102 | :processing |
|
||||
| 200 | :ok |
|
||||
| 201 | :created |
|
||||
| 202 | :accepted |
|
||||
| 203 | :non_authoritative_information |
|
||||
| 204 | :no_content |
|
||||
| 205 | :reset_content |
|
||||
| 206 | :partial_content |
|
||||
| 207 | :multi_status |
|
||||
| 226 | :im_used |
|
||||
| 300 | :multiple_choices |
|
||||
| 301 | :moved_permanently |
|
||||
| 302 | :found |
|
||||
| 303 | :see_other |
|
||||
| 304 | :not_modified |
|
||||
| 305 | :use_proxy |
|
||||
| 306 | :reserved |
|
||||
| 307 | :temporary_redirect |
|
||||
| 400 | :bad_request |
|
||||
| 401 | :unauthorized |
|
||||
| 402 | :payment_required |
|
||||
| 403 | :forbidden |
|
||||
| 404 | :not_found |
|
||||
| 405 | :method_not_allowed |
|
||||
| 406 | :not_acceptable |
|
||||
| 407 | :proxy_authentication_required |
|
||||
| 408 | :request_timeout |
|
||||
| 409 | :conflict |
|
||||
| 410 | :gone |
|
||||
| 411 | :length_required |
|
||||
| 412 | :precondition_failed |
|
||||
| 413 | :request_entity_too_large |
|
||||
| 414 | :request_uri_too_long |
|
||||
| 415 | :unsupported_media_type |
|
||||
| 416 | :requested_range_not_satisfiable |
|
||||
| 417 | :expectation_failed |
|
||||
| 418 | :i'm_a_teapot |
|
||||
| 422 | :unprocessable_entity |
|
||||
| 423 | :locked |
|
||||
| 424 | :failed_dependency |
|
||||
| 426 | :upgrade_required |
|
||||
| 500 | :internal_server_error |
|
||||
| 501 | :not_implemented |
|
||||
| 502 | :bad_gateway |
|
||||
| 503 | :service_unavailable |
|
||||
| 504 | :gateway_timeout |
|
||||
| 505 | :http_version_not_supported |
|
||||
| 506 | :variant_also_negotiates |
|
||||
| 507 | :insufficient_storage |
|
||||
| 510 | :not_extended |
|
||||
|
||||
##### The `:location` Option
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@ After reading this guide, you will know:
|
|||
Usage
|
||||
-----
|
||||
|
||||
To apply a template, you need to provide the Rails generator with the location of the template you wish to apply, using -m option. This can either be path to a file or a URL.
|
||||
To apply a template, you need to provide the Rails generator with the location of the template you wish to apply using the -m option. This can either be a path to a file or a URL.
|
||||
|
||||
```bash
|
||||
$ rails new blog -m ~/template.rb
|
||||
|
@ -30,7 +30,7 @@ $ rake rails:template LOCATION=http://example.com/template.rb
|
|||
Template API
|
||||
------------
|
||||
|
||||
Rails templates API is very self explanatory and easy to understand. Here's an example of a typical Rails template:
|
||||
The Rails templates API is easy to understand. Here's an example of a typical Rails template:
|
||||
|
||||
```ruby
|
||||
# template.rb
|
||||
|
@ -43,7 +43,7 @@ git add: "."
|
|||
git commit: %Q{ -m 'Initial commit' }
|
||||
```
|
||||
|
||||
The following sections outlines the primary methods provided by the API:
|
||||
The following sections outline the primary methods provided by the API:
|
||||
|
||||
### gem(*args)
|
||||
|
||||
|
@ -66,7 +66,7 @@ bundle install
|
|||
|
||||
Wraps gem entries inside a group.
|
||||
|
||||
For example, if you want to load `rspec-rails` only in `development` and `test` group:
|
||||
For example, if you want to load `rspec-rails` only in the `development` and `test` groups:
|
||||
|
||||
```ruby
|
||||
gem_group :development, :test do
|
||||
|
@ -100,7 +100,7 @@ A block can be used in place of the `data` argument.
|
|||
|
||||
Adds an initializer to the generated application’s `config/initializers` directory.
|
||||
|
||||
Lets say you like using `Object#not_nil?` and `Object#not_blank?`:
|
||||
Let's say you like using `Object#not_nil?` and `Object#not_blank?`:
|
||||
|
||||
```ruby
|
||||
initializer 'bloatlol.rb', <<-CODE
|
||||
|
@ -116,9 +116,9 @@ initializer 'bloatlol.rb', <<-CODE
|
|||
CODE
|
||||
```
|
||||
|
||||
Similarly `lib()` creates a file in the `lib/` directory and `vendor()` creates a file in the `vendor/` directory.
|
||||
Similarly, `lib()` creates a file in the `lib/` directory and `vendor()` creates a file in the `vendor/` directory.
|
||||
|
||||
There is even `file()`, which accepts a relative path from `Rails.root` and creates all the directories/file needed:
|
||||
There is even `file()`, which accepts a relative path from `Rails.root` and creates all the directories/files needed:
|
||||
|
||||
```ruby
|
||||
file 'app/components/foo.rb', <<-CODE
|
||||
|
@ -127,7 +127,7 @@ file 'app/components/foo.rb', <<-CODE
|
|||
CODE
|
||||
```
|
||||
|
||||
That’ll create `app/components` directory and put `foo.rb` in there.
|
||||
That’ll create the `app/components` directory and put `foo.rb` in there.
|
||||
|
||||
### rakefile(filename, data = nil, &block)
|
||||
|
||||
|
@ -179,7 +179,7 @@ rake "db:migrate", env: 'production'
|
|||
|
||||
### route(routing_code)
|
||||
|
||||
Adds a routing entry to the `config/routes.rb` file. In above steps, we generated a person scaffold and also removed `README.rdoc`. Now to make `PeopleController#index` as the default page for the application:
|
||||
Adds a routing entry to the `config/routes.rb` file. In the steps above, we generated a person scaffold and also removed `README.rdoc`. Now, to make `PeopleController#index` the default page for the application:
|
||||
|
||||
```ruby
|
||||
route "root to: 'person#index'"
|
||||
|
@ -197,7 +197,7 @@ end
|
|||
|
||||
### ask(question)
|
||||
|
||||
`ask()` gives you a chance to get some feedback from the user and use it in your templates. Lets say you want your user to name the new shiny library you’re adding:
|
||||
`ask()` gives you a chance to get some feedback from the user and use it in your templates. Let's say you want your user to name the new shiny library you’re adding:
|
||||
|
||||
```ruby
|
||||
lib_name = ask("What do you want to call the shiny library ?")
|
||||
|
@ -211,7 +211,7 @@ CODE
|
|||
|
||||
### yes?(question) or no?(question)
|
||||
|
||||
These methods let you ask questions from templates and decide the flow based on the user’s answer. Lets say you want to freeze rails only if the user want to:
|
||||
These methods let you ask questions from templates and decide the flow based on the user’s answer. Let's say you want to freeze rails only if the user wants to:
|
||||
|
||||
```ruby
|
||||
rake("rails:freeze:gems") if yes?("Freeze rails gems?")
|
||||
|
|
|
@ -28,7 +28,10 @@ Rails on Rack
|
|||
|
||||
### Rails Application's Rack Object
|
||||
|
||||
`ApplicationName::Application` is the primary Rack application object of a Rails application. Any Rack compliant web server should be using `ApplicationName::Application` object to serve a Rails application.
|
||||
`ApplicationName::Application` is the primary Rack application object of a Rails
|
||||
application. Any Rack compliant web server should be using
|
||||
`ApplicationName::Application` object to serve a Rails
|
||||
application. `Rails.application` refers to the same application object.
|
||||
|
||||
### `rails server`
|
||||
|
||||
|
@ -79,11 +82,11 @@ To use `rackup` instead of Rails' `rails server`, you can put the following insi
|
|||
|
||||
```ruby
|
||||
# Rails.root/config.ru
|
||||
require "config/environment"
|
||||
require ::File.expand_path('../config/environment', __FILE__)
|
||||
|
||||
use Rack::Debugger
|
||||
use Rack::ContentLength
|
||||
run ApplicationName::Application
|
||||
run Rails.application
|
||||
```
|
||||
|
||||
And start the server:
|
||||
|
@ -101,7 +104,7 @@ $ rackup --help
|
|||
Action Dispatcher Middleware Stack
|
||||
----------------------------------
|
||||
|
||||
Many of Action Dispatchers's internal components are implemented as Rack middlewares. `Rails::Application` uses `ActionDispatch::MiddlewareStack` to combine various internal and external middlewares to form a complete Rails Rack application.
|
||||
Many of Action Dispatcher's internal components are implemented as Rack middlewares. `Rails::Application` uses `ActionDispatch::MiddlewareStack` to combine various internal and external middlewares to form a complete Rails Rack application.
|
||||
|
||||
NOTE: `ActionDispatch::MiddlewareStack` is Rails equivalent of `Rack::Builder`, but built for better flexibility and more features to meet Rails' requirements.
|
||||
|
||||
|
@ -324,7 +327,7 @@ config.middleware.clear
|
|||
```ruby
|
||||
# config.ru
|
||||
use MyOwnStackFromScratch
|
||||
run ApplicationName::Application
|
||||
run Rails.application
|
||||
```
|
||||
|
||||
Resources
|
||||
|
|
|
@ -138,6 +138,12 @@ Sometimes, you have a resource that clients always look up without referencing a
|
|||
get 'profile', to: 'users#show'
|
||||
```
|
||||
|
||||
Passing a `String` to `match` will expect a `controller#action` format, while passing a `Symbol` will map directly to an action:
|
||||
|
||||
```ruby
|
||||
get 'profile', to: :show
|
||||
```
|
||||
|
||||
This resourceful route:
|
||||
|
||||
```ruby
|
||||
|
|
|
@ -128,12 +128,12 @@ When you use `rails generate scaffold`, for a resource among other things it cre
|
|||
$ rails generate scaffold post title:string body:text
|
||||
...
|
||||
create app/models/post.rb
|
||||
create test/unit/post_test.rb
|
||||
create test/models/post_test.rb
|
||||
create test/fixtures/posts.yml
|
||||
...
|
||||
```
|
||||
|
||||
The default test stub in `test/unit/post_test.rb` looks like this:
|
||||
The default test stub in `test/models/post_test.rb` looks like this:
|
||||
|
||||
```ruby
|
||||
require 'test_helper'
|
||||
|
@ -714,17 +714,17 @@ class UserFlowsTest < ActionDispatch::IntegrationTest
|
|||
|
||||
test "login and browse site" do
|
||||
|
||||
# User avs logs in
|
||||
avs = login(:david)
|
||||
# User david logs in
|
||||
david = login(:david)
|
||||
# User guest logs in
|
||||
guest = login(:guest)
|
||||
|
||||
# Both are now available in different sessions
|
||||
assert_equal 'Welcome david!', avs.flash[:notice]
|
||||
assert_equal 'Welcome david!', david.flash[:notice]
|
||||
assert_equal 'Welcome guest!', guest.flash[:notice]
|
||||
|
||||
# User avs can browse site
|
||||
avs.browses_site
|
||||
# User david can browse site
|
||||
david.browses_site
|
||||
# User guest can browse site as well
|
||||
guest.browses_site
|
||||
|
||||
|
|
|
@ -71,7 +71,7 @@ Rails 4.0 extracted Active Resource to its own gem. If you still need the featur
|
|||
|
||||
* 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 behavior. This means that you can comment or remove the following option in the `config/initializers/wrap_parameters.rb` file:
|
||||
* 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.
|
||||
|
@ -320,7 +320,7 @@ config.assets.debug = true
|
|||
Again, most of the changes below are for the asset pipeline. You can read more about these in the [Asset Pipeline](asset_pipeline.html) guide.
|
||||
|
||||
```ruby
|
||||
# Compress JavaScript and CSS
|
||||
# Compress JavaScripts and CSS
|
||||
config.assets.compress = true
|
||||
|
||||
# Don't fallback to assets pipeline if a precompiled asset is missed
|
||||
|
|
Loading…
Reference in New Issue