2012-02-06 3 views
0

В Rails 3.1.3 с Postgresql, если вы создаете атрибут как дату и время, его класс с ActiveSupport :: TimeWithZone. Тем не менее, любой, кто может объяснить это:Rails: обновление ActiveSupport :: поля TimeWithZone с помощью Time by update_attributes fail

user=User.first 
user.update_attributes(:last_signed_in_at => Time.now) #True, but record isn't updated 
user.update_attribute(:last_signed_in_at, Time.now) #True, and record is updated 
user.last_signed_in_at = Time.now 
user.save #True, and the record is updated 

update_attributes отличается от update_attribute, что он проверяет валидации. Единственная причина, по которой это не удается:

user.last_signed_in_at = ActiveSupport::TimeWithZone 
Time.now.class = Time 

Любой, кто имеет возможность разобраться с этим?

+0

У вас есть 'attr_accessible' в вашей модели пользователя? – PeterWong

+0

Большое спасибо, чувак. attr_accessible: указывает белый список атрибутов модели, которые могут быть заданы с помощью массового присвоения, такие как новые (атрибуты), update_attributes (атрибуты) или атрибуты = (атрибуты) – aquajach

+0

Так что это устраняет вашу проблему :)? – PeterWong

ответ

0

Это связано с установкой attr_accessible в модели пользователя.

Что такое update_attribtue действительно на самом деле очень похоже на вызов last_signed_in_at=. увидеть источник в http://apidock.com/rails/ActiveRecord/Persistence/update_attribute

Одним из основных различий между update_attributes и update_attribute что update_attributes это сделать массовое назначение, а update_attribute нет.

Именно поэтому совершенно очевидно, что это проблема attr_accessible.