mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
428d47adfe
The focus of this change is to make the API more accessible. References to method and classes should be linked to make it easy to navigate around. This patch makes exzessiv use of `rdoc-ref:` to provide more readable docs. This makes it possible to document `ActiveRecord::Base#save` even though the method is within a separate module `ActiveRecord::Persistence`. The goal here is to bring the API closer to the actual code that you would write. This commit only deals with Active Record. The other gems will be updated accordingly but in different commits. The pass through Active Record is not completely finished yet. A follow up commit will change the spots I haven't yet had the time to update. /cc @fxn
91 lines
3.3 KiB
Ruby
91 lines
3.3 KiB
Ruby
module ActiveRecord
|
|
# = Active Record \RecordInvalid
|
|
#
|
|
# Raised by {ActiveRecord::Base#save!}[rdoc-ref:Persistence#save!] and
|
|
# {ActiveRecord::Base#create!}[rdoc-ref:Persistence::ClassMethods#create!] when the record is invalid.
|
|
# Use the #record method to retrieve the record which did not validate.
|
|
#
|
|
# begin
|
|
# complex_operation_that_internally_calls_save!
|
|
# rescue ActiveRecord::RecordInvalid => invalid
|
|
# puts invalid.record.errors
|
|
# end
|
|
class RecordInvalid < ActiveRecordError
|
|
attr_reader :record
|
|
|
|
def initialize(record = nil)
|
|
if record
|
|
@record = record
|
|
errors = @record.errors.full_messages.join(", ")
|
|
message = I18n.t(:"#{@record.class.i18n_scope}.errors.messages.record_invalid", errors: errors, default: :"errors.messages.record_invalid")
|
|
else
|
|
message = "Record invalid"
|
|
end
|
|
|
|
super(message)
|
|
end
|
|
end
|
|
|
|
# = Active Record \Validations
|
|
#
|
|
# Active Record includes the majority of its validations from ActiveModel::Validations
|
|
# all of which accept the <tt>:on</tt> argument to define the context where the
|
|
# validations are active. Active Record will always supply either the context of
|
|
# <tt>:create</tt> or <tt>:update</tt> dependent on whether the model is a
|
|
# {new_record?}[rdoc-ref:Persistence#new_record?].
|
|
module Validations
|
|
extend ActiveSupport::Concern
|
|
include ActiveModel::Validations
|
|
|
|
# The validation process on save can be skipped by passing <tt>validate: false</tt>.
|
|
# The regular {ActiveRecord::Base#save}[rdoc-ref:Persistence#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 {ActiveRecord::Base#save}[rdoc-ref:Base#save] but
|
|
# will raise a ActiveRecord::RecordInvalid exception instead of returning +false+ if the record is not valid.
|
|
def save!(options={})
|
|
perform_validations(options) ? super : raise_validation_error
|
|
end
|
|
|
|
# Runs all the validations within the specified context. Returns +true+ if
|
|
# no errors are found, +false+ otherwise.
|
|
#
|
|
# Aliased as #validate.
|
|
#
|
|
# If the argument is +false+ (default is +nil+), the context is set to <tt>:create</tt> if
|
|
# {new_record?}[rdoc-ref:Persistence#new_record?] is +true+, and to <tt>:update</tt> if it is not.
|
|
#
|
|
# \Validations with no <tt>:on</tt> option will run no matter the context. \Validations with
|
|
# some <tt>:on</tt> option will only run in the specified context.
|
|
def valid?(context = nil)
|
|
context ||= default_validation_context
|
|
output = super(context)
|
|
errors.empty? && output
|
|
end
|
|
|
|
alias_method :validate, :valid?
|
|
|
|
protected
|
|
|
|
def default_validation_context
|
|
new_record? ? :create : :update
|
|
end
|
|
|
|
def raise_validation_error
|
|
raise(RecordInvalid.new(self))
|
|
end
|
|
|
|
def perform_validations(options={}) # :nodoc:
|
|
options[:validate] == false || valid?(options[:context])
|
|
end
|
|
end
|
|
end
|
|
|
|
require "active_record/validations/associated"
|
|
require "active_record/validations/uniqueness"
|
|
require "active_record/validations/presence"
|
|
require "active_record/validations/absence"
|
|
require "active_record/validations/length"
|