2016-09-20 2 views
0

before_save обратного вызов необходим обновить просроченное значение поля для true или false на основе коды ниже:перед сохранением обратного вызова для булева поля

class Package < ActiveRecord::Base 
    before_save :update_availabiltiy 

    def update_availabiltiy 
    self.expired = date_end.to_date < Date.today 
    end 
end 

, но это не будет работать, если значение этого поля не является таким же, как хранится один, в примере: если это поле верно в БД и условие обратного вызова будет вычисляться так, запись будет сохранена, в противном случае контроллер будет возвращать 400

Started PUT "/api/venues/bogan-and-sons/packages/delicious-package" for ::1 at 2016-09-20 15:20:03 +0300 
Processing by Api::PackagesController#update as JSON 

Parameters: {"package"=> 
    {"date_start"=>"2016-08-27T00:00:00.000-04:00", "date_end"=>"2016-12-30, ...} 
} 
(0.2ms) BEGIN 
(0.1ms) ROLLBACK 
Completed 400 Bad Request in 81ms (Views: 0.6ms | ActiveRecord: 17.8ms) 

object.errors возвращает пустой массив, поэтому нет фактического ошибка на объекте предварительно послал.

Обновление для Andrey:

[31, 40] in /Users/srosca/projects/venuezz/app/models/package.rb 
    31:  !expired || (Date.today <= self.date_end.to_date) 
    32: end 
    33: 
    34: def update_availabiltiy 
    35:  byebug 
=> 36:  self.expired = date_end.to_date < Date.today 
    37: end 
    38: 
    39: def calculate_discount 
    40:  if discount_price 
(byebug) expired 
true 
(byebug) date_end.to_date < Date.today 
false 
(byebug) self.expired = date_end.to_date < Date.today 
false 
(byebug) expired 
false 
+0

показать все параметры 'package', пожалуйста, –

+0

Используйте метод« strftime »ruby, чтобы отформатировать их одинаково в вашем обратном вызове, а затем сравнить. – bkunzi01

+1

также, чтобы увидеть настоящую проблему, добавьте bang в метод: 'save!' Или 'update!' –

ответ

1

Причина ошибки заключается в том, что before_save крючки имеют возможность отменить операцию сохранения путем возврата false (что происходит, когда ваша запись не истек

.

Возвращение что-то другое, а не результат выполнения задания, например:.

def update_availabiltiy 
    self.expired = date_end.to_date < Date.today 

    true # no canceling 
    end 
Смежные вопросы