2012-05-04 2 views
0

У меня есть сообщение has_many Комментарии. Post имеет атрибут boolean published. Когда post.published является ложным, новый комментарий не должен быть действительным. Какова наилучшая практика для такого рода проверки?Пользовательская проверка в Rails

Я попытался сделать это таким образом, но, к сожалению, он работает неправильно. По-прежнему можно создать новый комментарий для неопубликованного сообщения.

class Comment < ActiveRecord::Base 
    validates :post_id, presence: true, if: :post_is_published 

    ... 
    def post_is_publised 
    post && post.published 
    end 
end 

ответ

1

Хм .. Я думаю, что у вас есть синтаксические ошибки в коде ... Попробуйте это:

class Comment < ActiveRecord::Base 
    validates :post_id, :presence => true, :if => :post_is_published 

    def post_is_publised 
    post.try(:published) 
    end 
end 

После прочтения вашего вывода на консоль и проверить ваш вопрос еще раз:

class Comment < ActiveRecord::Base 
    validate :post_has_to_be_published 

    def post_has_to_be_published 
    unless post.try(:published) 
     self.errors.add(:base, "you can add comments only to published posts") 
    end 
    end 
end 

Я понимаю, что вы не хотите добавлять комментарии к неопубликованным сообщениям. Выше код должен это сделать.

+2

Возможно, вы захотите взглянуть на [Object # try] (http://api.rubyonrails.org/classes/Object.html#method-i-try), чтобы высушить свой код до крошечного крошечного бита. – x1a4

+0

Вы предлагаете 'post.try (: published)'? Не знал об этом, но уверен, делает его более ясным, спасибо. –

+1

Да, у ActiveSupport есть несколько [довольно полезных вещей] (http://guides.rubyonrails.org/active_support_core_extensions.html), даже если он не очень хорошо документирован. – x1a4

Смежные вопросы