2015-01-20 2 views
0

Я пишу плагин Redmine, который должен проверить, заполнены ли какие-либо поля проблемы в зависимости от значений в других полях.
Я написал плагин, который реализует обратный вызов validate, но я не знаю, как проверить значения полей, которые будут сохранены. Это то, что я до сих пор:Rails: как проверить значение поля объекта перед сохранением?

module IssuePatch 

def self.included(receiver) 

    receiver.class_eval do 
    unloadable 

    validate :require_comment_when_risk 

    protected 
    def require_comment_when_risk 
     risk_reduction = self.custom_value_for(3) 
     if risk_reduction.nil? || risk_reduction.value == 0 
     return true 
     end 

     comment2 = self.custom_value_for(4) 
     if comment2.nil? || comment2.value.empty? 
     errors.add(:comment2, "Comment2 is empty") 
     end 
    end 
    end 
end 
end 

Проблема здесь состоит в том, что self.custom_value_for() возвращает значение уже написал к БД, но не один, что собирается быть написано, поэтому проверка Безразлично» т работы. Как проверить значение, которое было передано из веб-формы?

Любая помощь будет принята с благодарностью.

+0

Какой метод является 'custom_value_for'? – Rodrigo

+0

@Rodrigo, это метод модели проблемы – svz

+0

Извините, я не знаю Redmine! Но это руководство поможет вам: http://guides.rubyonrails.org/active_record_validations.html#performing-custom-validations – Rodrigo

ответ

1

Замечательно, что в вашем контроллере вам не нужно ничего проверять. Вы должны сделать все это в своей модели. поэтому в вашей модели вы должны делать что-то вроде

validates :value_that_you_care_about, :numericality => { :greater_than_or_equal_to => 0 } 

или

validates :buyer_name, presence: true, :length => {:minimum => 4} 

или

validates :delivery_location, presence: true 

Если какой-либо из них не в состоянии это остановит объект из спасаемых, и если вы используя rails scaffolding, на самом деле выделит неверное поле и даст им сообщение об ошибке, объяснив, что не так. Вы также можете написать свою собственную валидацию, такие как

def enough_red_flowers inventory 
    if inventory.total_red_flowers-self.red_flower_quantity < 0 
     self.errors.add(:base, 'There are not enough Red Flowers Currently') 
     return false 
    end 
    inventory.total_red_flowers = inventory.total_red_flowers-self.red_flower_quantity 
    inventory.save 
    true 
    end 

Чтобы написать собственное сообщение просто следовать примеру self.errors.add(:base, 'your message')

Вы можете найти более валидации here

2

Лучшего способ это создать валидатор

class FileValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
    # some logic for validation 
    end 
end 

затем в модели:

validates :file, file: true 

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

  • Нет связанных вопросов^_^