提交 c6d685ba 编写于 作者: E Eric Chahin

Fixed custom validation context bug where child

associations were not being saved.

Fixes #13854.

[Eric Chahin, Aaron Nelson, & Kevin Casey]
上级 87615570
* Rails will now pass a custom validation context through to autosave associations
in order to validate child associations with the same context.
Fixes #13854.
*Eric Chahin*, *Aaron Nelson*, *Kevin Casey*
* When using a custom `join_table` name on a `habtm`, rails was not saving it
on Reflections. This causes a problem when rails loads fixtures, because it
uses the reflections to set database with fixtures.
......
......@@ -304,7 +304,8 @@ def validate_collection_association(reflection)
def association_valid?(reflection, record)
return true if record.destroyed? || record.marked_for_destruction?
unless valid = record.valid?
validation_context = self.validation_context unless [:create,:update].include?(self.validation_context)
unless valid = record.valid?(validation_context)
if reflection.options[:autosave]
record.errors.each do |attribute, message|
attribute = "#{reflection.name}.#{attribute}"
......
......@@ -26,6 +26,8 @@
require 'models/job'
require 'models/college'
require 'models/student'
require 'models/pirate'
require 'models/ship'
class HasManyAssociationsTestForReorderWithJoinDependency < ActiveRecord::TestCase
fixtures :authors, :posts, :comments
......@@ -1877,4 +1879,12 @@ def test_collection_association_with_private_kernel_method
end
end
end
test 'has_many_association passes context validation to validate children' do
pirate = FamousPirate.new
pirate.famous_ships << ship = FamousShip.new
assert_equal true, pirate.valid?
assert_equal false, pirate.valid?(:conference)
assert_equal "can't be blank", ship.errors[:name].first
end
end
......@@ -84,3 +84,9 @@ def log(record, callback)
class DestructivePirate < Pirate
has_one :dependent_ship, :class_name => 'Ship', :foreign_key => :pirate_id, :dependent => :destroy
end
class FamousPirate < ActiveRecord::Base
self.table_name = 'pirates'
has_many :famous_ships
validates_presence_of :catchphrase, on: :conference
end
\ No newline at end of file
......@@ -17,3 +17,9 @@ def cancel_save_callback_method
false
end
end
class FamousShip < ActiveRecord::Base
self.table_name = 'ships'
belongs_to :famous_pirate
validates_presence_of :name, on: :conference
end
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册