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
показать все параметры 'package', пожалуйста, –
Используйте метод« strftime »ruby, чтобы отформатировать их одинаково в вашем обратном вызове, а затем сравнить. – bkunzi01
также, чтобы увидеть настоящую проблему, добавьте bang в метод: 'save!' Или 'update!' –