Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

context in validation goes through has many relationship #13978

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion activerecord/lib/active_record/autosave_association.rb
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ def validate_collection_association(reflection)
def association_valid?(reflection, record)
return true if record.destroyed? || record.marked_for_destruction?

unless valid = record.valid?
unless valid = record.valid?(self.validation_context)
if reflection.options[:autosave]
record.errors.each do |attribute, message|
attribute = "#{reflection.name}.#{attribute}"
Expand Down
10 changes: 10 additions & 0 deletions activerecord/test/cases/associations/has_many_associations_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
require 'models/categorization'
require 'models/minivan'
require 'models/speedometer'
require 'models/pirate'
require 'models/ship'

class HasManyAssociationsTestForReorderWithJoinDependency < ActiveRecord::TestCase
fixtures :authors, :posts, :comments
Expand Down Expand Up @@ -1830,4 +1832,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
8 changes: 8 additions & 0 deletions activerecord/test/models/pirate.rb
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,11 @@ 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
8 changes: 8 additions & 0 deletions activerecord/test/models/ship.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,11 @@ 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