2013-09-12 4 views
0

Я пытаюсь проверить формат exchange_rate в моем Invoice классе:Как создать формат Rails с динамическим валидатором?

class Invoice < ActiveRecord::Base 

    attr_accessible :currency, :exchange_rate 

    validates :exchange_rate, :format => { :with => exchange_rate_format } 

    private 

    def exchange_rate_format 
    if currency != user.preference.base_currency 
     DECIMAL_REGEX 
    else 
     ANOTHER_REGEX 
    end 
    end 

end 

Проблема заключается в том: Это не работает. Думаю, мне нужно использовать Proc здесь? Я никогда не понимал, как его использовать. Может, кто-то может помочь.

Большое спасибо.

+0

Пожалуйста, всегда включают в себя версию '' Ruby' и Rails' вы используете. – Bala

+0

Ruby 1.9.3, Rails 3.2.13 – Tintin81

ответ

1

Да, вам необходимо использовать Proc или лямбда, чтобы проверка выполнялась во время выполнения.

validates :exchange_rate, format: { with: ->(invoice) { invoice.exchange_rate_format } } 
# Note, I used Ruby 1.9 hash and lambda syntax here. 

Для этого вам нужно переместить exchange_rate_format из списка private методов, так как мы определяем явный приемник (invoice). Вы можете сделать это protected вместо этого, если хотите. Или вы можете поместить условное выражение в лямбду.

1

Один из способов сделать это с помощью валидатора:

class Invoice < ActiveRecord::Base 
    class ExchangeRateFormatValidator < ActiveModel::EachValidator 
    def validate_each(record, attribute, value) 
     if !value =~ record.exchange_rate_format 
     record.errors[attribute] << "your currency is weak sauce" 
     end 
    end 
    end 

    validates :exchange_rate, exchange_rate_format: true 

    # make public 
    def exchange_rate_format 
    if currency != user.preference.base_currency 
     DECIMAL_REGEX 
    else 
    ANOTHER_REGEX 
    end 
    end 
end 
Смежные вопросы