save(false) is gone, use save(:validate => false) instead.

This commit is contained in:
José Valim 2010-01-17 14:22:27 +01:00
parent 020e656447
commit c0d31ca41b
11 changed files with 66 additions and 26 deletions

@ -37,7 +37,7 @@ def insert_record(record, force = true, validate = true)
if force
record.save!
else
return false unless record.save(validate)
return false unless record.save(:validate => validate)
end
end

@ -58,7 +58,7 @@ def cached_counter_attribute_name
def insert_record(record, force = false, validate = true)
set_belongs_to_association_for(record)
force ? record.save! : record.save(validate)
force ? record.save! : record.save(:validate => validate)
end
# Deletes the records according to the <tt>:dependent</tt> option.

@ -60,7 +60,7 @@ def insert_record(record, force = true, validate = true)
if force
record.save!
else
return false unless record.save(validate)
return false unless record.save(:validate => validate)
end
end

@ -116,14 +116,14 @@ module ActiveRecord
# post = Post.find(1)
# post.author.name = ''
# post.save # => false
# post.errors # => #<ActiveRecord::Errors:0x174498c @errors={"author_name"=>["can't be blank"]}, @base=#<Post ...>>
# post.errors # => #<ActiveRecord::Errors:0x174498c @errors={"author.name"=>["can't be blank"]}, @base=#<Post ...>>
#
# No validations will be performed on the associated models when validations
# are skipped for the parent:
#
# post = Post.find(1)
# post.author.name = ''
# post.save(false) # => true
# post.save(:validate => false) # => true
module AutosaveAssociation
extend ActiveSupport::Concern
@ -302,7 +302,7 @@ def save_collection_association(reflection)
association.send(:insert_record, record)
end
elsif autosave
saved = record.save(false)
saved = record.save(:validate => false)
end
raise ActiveRecord::Rollback if saved == false
@ -332,7 +332,7 @@ def save_has_one_association(reflection)
key = reflection.options[:primary_key] ? send(reflection.options[:primary_key]) : id
if autosave != false && (new_record? || association.new_record? || association[reflection.primary_key_name] != key || autosave)
association[reflection.primary_key_name] = key
saved = association.save(!autosave)
saved = association.save(:validate => !autosave)
raise ActiveRecord::Rollback if !saved && autosave
saved
end
@ -355,7 +355,7 @@ def save_belongs_to_association(reflection)
if autosave && association.marked_for_destruction?
association.destroy
elsif autosave != false
saved = association.save(!autosave) if association.new_record? || autosave
saved = association.save(:validate => !autosave) if association.new_record? || autosave
if association.updated?
association_id = association.send(reflection.options[:primary_key] || :id)

@ -2136,16 +2136,16 @@ def destroyed?
end
# :call-seq:
# save(perform_validation = true)
# save(options)
#
# Saves the model.
#
# If the model is new a record gets created in the database, otherwise
# the existing record gets updated.
#
# If +perform_validation+ is true validations run. If any of them fail
# the action is cancelled and +save+ returns +false+. If the flag is
# false validations are bypassed altogether. See
# By default, save always run validations. If any of them fail the action
# is cancelled and +save+ returns +false+. However, if you supply
# :validate => false, validations are bypassed altogether. See
# ActiveRecord::Validations for more information.
#
# There's a series of callbacks associated with +save+. If any of the
@ -2220,7 +2220,7 @@ def becomes(klass)
# in Base is replaced with this when the validations module is mixed in, which it is by default.
def update_attribute(name, value)
send(name.to_s + '=', value)
save(false)
save(:validate => false)
end
# Updates all the attributes from the passed-in Hash and saves the record. If the object is invalid, the saving will

@ -192,8 +192,8 @@ def destroy_with_transactions #:nodoc:
with_transaction_returning_status(:destroy_without_transactions)
end
def save_with_transactions(perform_validation = true) #:nodoc:
rollback_active_record_state! { with_transaction_returning_status(:save_without_transactions, perform_validation) }
def save_with_transactions(*args) #:nodoc:
rollback_active_record_state! { with_transaction_returning_status(:save_without_transactions, *args) }
end
def save_with_transactions! #:nodoc:

@ -42,7 +42,17 @@ def create!(attributes = nil, &block)
module InstanceMethods
# The validation process on save can be skipped by passing false. The regular Base#save method is
# replaced with this when the validations module is mixed in, which it is by default.
def save_with_validation(perform_validation = true)
def save_with_validation(options=nil)
perform_validation = case options
when NilClass
true
when Hash
options[:validate] != false
else
ActiveSupport::Deprecation.warn "save(#{options}) is deprecated, please give save(:validate => #{options}) instead", caller
options
end
if perform_validation && valid? || !perform_validation
save_without_validation
else

@ -805,7 +805,7 @@ def test_should_not_ignore_different_error_messages_on_the_same_attribute
def test_should_still_allow_to_bypass_validations_on_the_associated_model
@pirate.catchphrase = ''
@pirate.ship.name = ''
@pirate.save(false)
@pirate.save(:validate => false)
# Oracle saves empty string as NULL
if current_adapter?(:OracleAdapter)
assert_equal [nil, nil], [@pirate.reload.catchphrase, @pirate.ship.name]
@ -820,7 +820,7 @@ def test_should_allow_to_bypass_validations_on_associated_models_at_any_depth
@pirate.catchphrase = ''
@pirate.ship.name = ''
@pirate.ship.parts.each { |part| part.name = '' }
@pirate.save(false)
@pirate.save(:validate => false)
values = [@pirate.reload.catchphrase, @pirate.ship.name, *@pirate.ship.parts.map(&:name)]
# Oracle saves empty string as NULL
@ -917,7 +917,7 @@ def test_should_merge_errors_on_the_associated_model_onto_the_parent_even_if_it_
def test_should_still_allow_to_bypass_validations_on_the_associated_model
@ship.pirate.catchphrase = ''
@ship.name = ''
@ship.save(false)
@ship.save(:validate => false)
# Oracle saves empty string as NULL
if current_adapter?(:OracleAdapter)
assert_equal [nil, nil], [@ship.reload.name, @ship.pirate.catchphrase]
@ -1029,7 +1029,7 @@ def test_should_allow_to_bypass_validations_on_the_associated_models_on_update
@pirate.catchphrase = ''
@pirate.send(@association_name).each { |child| child.name = '' }
assert @pirate.save(false)
assert @pirate.save(:validate => false)
# Oracle saves empty string as NULL
if current_adapter?(:OracleAdapter)
assert_equal [nil, nil, nil], [
@ -1049,14 +1049,14 @@ def test_should_allow_to_bypass_validations_on_the_associated_models_on_update
def test_should_validation_the_associated_models_on_create
assert_no_difference("#{ @association_name == :birds ? 'Bird' : 'Parrot' }.count") do
2.times { @pirate.send(@association_name).build }
@pirate.save(true)
@pirate.save
end
end
def test_should_allow_to_bypass_validations_on_the_associated_models_on_create
assert_difference("#{ @association_name == :birds ? 'Bird' : 'Parrot' }.count", +2) do
2.times { @pirate.send(@association_name).build }
@pirate.save(false)
@pirate.save(:validate => false)
end
end

@ -124,7 +124,15 @@ def test_create_with_exceptions_using_scope_and_empty_attributes
def test_create_without_validation
reply = WrongReply.new
assert !reply.save
assert reply.save(false)
assert reply.save(:validate => false)
end
def test_deprecated_create_without_validation
reply = WrongReply.new
assert !reply.save
assert_deprecated do
assert reply.save(false)
end
end
def test_create_without_validation_bang

@ -58,9 +58,8 @@ def from_xml(xml, save_cache = false)
# person.save # => true (and person is now saved to the remote service)
#
module Validations
extend ActiveSupport::Concern
extend ActiveSupport::Concern
include ActiveModel::Validations
extend ActiveModel::Validations::ClassMethods
included do
alias_method_chain :save, :validation
@ -68,7 +67,17 @@ module Validations
# Validate a resource and save (POST) it to the remote web service.
# If any local validations fail - the save (POST) will not be attempted.
def save_with_validation(perform_validation = true)
def save_with_validation(options=nil)
perform_validation = case options
when Hash
options[:validate] != false
when NilClass
true
else
ActiveSupport::Deprecation.warn "save(#{options}) is deprecated, please give save(:validate => #{options}) instead", caller
options
end
# clear the remote validations so they don't interfere with the local
# ones. Otherwise we get an endless loop and can never change the
# fields so as to make the resource valid

@ -30,6 +30,19 @@ def test_fails_save!
assert_raise(ActiveResource::ResourceInvalid) { p.save! }
end
def test_save_without_validation
p = new_project(:name => nil)
assert !p.save
assert p.save(:validate => false)
end
def test_deprecated_save_without_validation
p = new_project(:name => nil)
assert !p.save
assert_deprecated do
assert p.save(false)
end
end
def test_validate_callback
# we have a callback ensuring the description is longer than three letters