From c0e020285f7d9e547feb1e4876acfa977ac1a5fb Mon Sep 17 00:00:00 2001 From: Victor Costa Date: Thu, 23 Jan 2014 11:30:13 -0300 Subject: [PATCH] container_block: avoid cyclical reference --- plugins/container_block/lib/container_block_plugin/container_block.rb | 10 ++++++++++ plugins/container_block/test/unit/container_block_plugin/container_block_test.rb | 13 +++++++++++++ 2 files changed, 23 insertions(+), 0 deletions(-) diff --git a/plugins/container_block/lib/container_block_plugin/container_block.rb b/plugins/container_block/lib/container_block_plugin/container_block.rb index f422c53..cff00bc 100644 --- a/plugins/container_block/lib/container_block_plugin/container_block.rb +++ b/plugins/container_block/lib/container_block_plugin/container_block.rb @@ -7,6 +7,16 @@ class ContainerBlockPlugin::ContainerBlock < Block settings_items :container_box_id, :type => Integer, :default => nil settings_items :children_settings, :type => Hash, :default => {} + validate :no_cyclical_reference, :if => 'container_box_id.present?' + + def no_cyclical_reference + errors.add(:box_id, _('cyclical reference is not allowed.')) if box_id == container_box_id + end + + before_save do |b| + raise "cyclical reference is not allowed" if b.box_id == b.container_box_id && !b.container_box_id.blank? + end + def self.description _('Container') end diff --git a/plugins/container_block/test/unit/container_block_plugin/container_block_test.rb b/plugins/container_block/test/unit/container_block_plugin/container_block_test.rb index c364f9b..ed8e052 100644 --- a/plugins/container_block/test/unit/container_block_plugin/container_block_test.rb +++ b/plugins/container_block/test/unit/container_block_plugin/container_block_test.rb @@ -104,4 +104,17 @@ class ContainerBlockPlugin::ContainerBlockTest < ActiveSupport::TestCase assert_equal [1, 2, 3], [box1.reload.position, box2.reload.position, box3.reload.position] end + should 'be able to change box' do + @block.save! + @block.box = Box.new(:owner => Environment.default) + @block.save! + end + + should 'not able to change box to be the same as container_box' do + @block.save! + @block.box = @block.container_box + @block.save + assert @block.errors.invalid?(:box_id) + end + end -- libgit2 0.21.2