2011-11-08 2 views
5

У меня есть 2 модели с вложенными данными:update_attributes возвращает всегда верно, даже если nested_attributes являются недопустимыми

class Goodtender 

    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :name 
    field :count 
    references_many(:offerprices, :autosave => true) 
    accepts_nested_attributes_for :offerprices, :allow_destroy => true, :reject_if => :all_blank 

    validates_presence_of :name, :message => "Invalid" 
    validates_numericality_of :count, :message => 'Invalid' 
    validates_associated :offerprices, :message => 'Invalid' 


end 

class Offerprice 

    include Mongoid::Document 
    include Mongoid::Timestamps 

    field :summ 
    field :date_delivery, :type => DateTime 
    field :note 

    referenced_in :goodtender, :class_name => 'Goodtender' 

    validates_presence_of :date_delivery, :message => "Invalid" 
    validates_numericality_of :summ, :message => 'Invalid' 

end 

При создании вложенных записей, правильная проверка имеет место, например, если данные в гнездовой модели не правильно , поэтому команда:

@tender = Tender.new(params[:tender]) 
@tender.save 

возвращает ложные

но если данные обновления:

@tender = Tender.find(params[:id]) 
@tender.update_attributes(params[:tender]) 

всегда eturns правда

Даже если вложенные данные не действительны. Здесь данные родительских данных и valids, и если данные родителей недействительны, возвращается false, если одна из вложенных записей недействительна, они игнорируются при сохранении и update_attributes возвращает true. Есть ли возможность проверить данные на достоверность во время обновления всей вложенной цепочки данных? Спасибо, что ответили.

Я использую: Руби 1.8.7 RoR 3.0.9 Mongoid 2.0.1

+0

То же самое происходит в MySQL. Rails 3.0.11 –

+0

Вы пробовали каскадные обратные вызовы? – Baruch

ответ

1

Пожалуйста, проверьте "действительную" функцию для каждой модели для Validate. Пожалуйста, введите код, указанный ниже:

@tender = Tender.find(params[:id]) <br/> 
@tender.fieldname=params[:name] <br/> 
if @tender.valid? <br/> 
    @tender.save <br/> 
end <br/> 
Смежные вопросы