2010-09-23 3 views
0

Допустим, что у меня есть класс Comment, который является полиморфным, и я использую его во многих местах внутри системы.Применить валидацию только к одному объекту - Rails 3

класс Комментарий < ActiveRecord :: Base belongs_to: commentable,: полиморфный => верно attr_accessible: содержание конец

И это единственное место, в котором я хотел бы применить проверку на длину содержимого комментария. Как мне подойти к этой проблеме?

1) Используйте STI и добавьте новую проверку в подкласс - я чувствую, что это перегиб 2) Расширьте этот единственный объект, который создается/обновляется в контроллере с требуемой валидацией. Но как добиться этого без постоянного расширения своего класса?

+1

может ли вы рассказать нам больше о «этом одном месте»? – Swanand

+0

Вы считали, что просто используете HTML ': maxlength => n'? – Trip

+1

@Trip, мы всегда должны проверять его на стороне сервера, так как некоторые пользователи могут публиковать значения, но не используя вашу форму ... – PeterWong

ответ

0

Вы можете попытаться сделать это (Rails 2.3 стиля, как я не дал попробовать в Rails 3, но пока я предполагаю, что решение очень похоже):

class Comment < ActiveRecord::Base 
    belongs_to :commentable, :polymorphic => true 
    attr_accessor :content 

    attr_accessor :should_validate_comment_length 

    validates_length_of :content, :maximum => 100, :if => :should_validate_comment_length 
end 

Тогда в том месте, где проверка должно быть активными вы можете сделать:

def create 
    @comment = #somehow obtain a comment model instance (like from POST) 
    @comment.should_validate_comment_length = true 
    if @comment.valid? 
     ... 
end 

Надеется, что это поможет

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