2013-07-02 15 views
2

в domainpost.rb у меня есть это:рубин на рельсах: before_validation

class Domainpost < ActiveRecord::Base 
    attr_accessible :content, :additiona, :registerdate, :expiredate, :registerin, :price 

    belongs_to :user 
    before_save { |domainpost| domainpost.content = content.downcase } 

    before_validation :pricecheck 

    validates :price, allow_blank: false, presence: true 

    default_scope order: 'domainposts.created_at DESC' 

    def pricecheck 
    if price.blank? 
    price = 'no price' 
    end 
end 

и оно не работает , когда цена на пост пустой после сохранения является стил пустым, любая идея, что я делаю не так?

+0

может быть, ваша цена числовой формата, поэтому строка не может быть сохранена Ther е? – bodrovis

+0

@ user2531122 - локальная переменная – Viren

ответ

4

Это не работает, потому что вместо установки атрибута price из Domainpost экземпляра вы устанавливаете локальную переменную. Вместо этого вы должны сделать:

def pricecheck 
    self.price = 'no price' if price.blank? 
end 
+0

Не нужно явно указывать «я», так как цена = «нет цены» и self.price = «нет цены» в этом случае равна. Внутри метода pricecheck, self указывает на создаваемый/обновляемый объект, поэтому сам не нужен. – bodrovis

+5

Вы ошибаетесь. Когда вы используете методы setter, необходимо явно указать получателю сообщения. В противном случае будет задана только локальная переменная. Посмотрите на пример: 'цена = 'нет цены'' ' цена # =>' нет цены'' 'self.price # => nil'. –

1

В ответ по @Merek Липка и @muttonlamb вы можете попробовать эти подходы, но я предлагаю определен default value на вашей стороне базы данных

как на вашей миграции на поле цены просто это

t.[price_data_type],:price,:default => "Your Default value" 

Ну это будет заботиться о вашей проверке в модели я считаю,

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