Commit 0df8e456b1ccae787e2b69ddef78f8ec0152563c
Committed by
Daniela Feitosa
1 parent
16dd16e5
Exists in
master
and in
29 other branches
Not allow self and cyclical reference in article paternity
Showing
2 changed files
with
37 additions
and
0 deletions
Show diff stats
app/models/article.rb
... | ... | @@ -79,6 +79,25 @@ class Article < ActiveRecord::Base |
79 | 79 | validate :native_translation_must_have_language |
80 | 80 | validate :translation_must_have_language |
81 | 81 | |
82 | + validate :no_self_reference | |
83 | + validate :no_cyclical_reference, :if => 'parent_id.present?' | |
84 | + | |
85 | + def no_self_reference | |
86 | + errors.add(:parent_id, _('self-reference is not allowed.')) if id && parent_id == id | |
87 | + end | |
88 | + | |
89 | + def no_cyclical_reference | |
90 | + current_parent = Article.find(parent_id) | |
91 | + while current_parent | |
92 | + if current_parent == self | |
93 | + errors.add(:parent_id, _('cyclical reference is not allowed.')) | |
94 | + break | |
95 | + end | |
96 | + current_parent = current_parent.parent | |
97 | + end | |
98 | + end | |
99 | + | |
100 | + | |
82 | 101 | def is_trackable? |
83 | 102 | self.published? && self.notifiable? && self.advertise? && self.profile.public_profile |
84 | 103 | end | ... | ... |
test/unit/article_test.rb
... | ... | @@ -1800,4 +1800,22 @@ class ArticleTest < ActiveSupport::TestCase |
1800 | 1800 | assert_equal [f2.path,article.slug].join('/'), article.path |
1801 | 1801 | end |
1802 | 1802 | |
1803 | + should 'not allow parent as itself' do | |
1804 | + article = Article.create!(:name => 'Sample Article', :profile => profile) | |
1805 | + article.parent = article | |
1806 | + article.valid? | |
1807 | + | |
1808 | + assert article.errors.invalid?(:parent_id) | |
1809 | + end | |
1810 | + | |
1811 | + should 'not allow cyclical paternity' do | |
1812 | + a1 = Article.create!(:name => 'Sample Article 1', :profile => profile) | |
1813 | + a2 = Article.create!(:name => 'Sample Article 2', :profile => profile, :parent => a1) | |
1814 | + a3 = Article.create!(:name => 'Sample Article 3', :profile => profile, :parent => a2) | |
1815 | + a1.parent = a3 | |
1816 | + a1.valid? | |
1817 | + | |
1818 | + assert a1.errors.invalid?(:parent_id) | |
1819 | + end | |
1820 | + | |
1803 | 1821 | end | ... | ... |