0

我是 Rails 新手,并且有一个旧数据库,每个表中都包含 DateCreated 和 DateUpdated 列。我想在我的模型中使用内置的 created_at 和 updated_at 属性在保存之前设置这些字段,但我的尝试产生:NoMethodError (undefined method created_at' for #<Class:0x00000102b74d20>): app/models/user.rb:45:inset_create_update_time' app/models/user.rb:24:in block in <class:User>' app/controllers/users_controller.rb:15:increate'

型号代码:

class User < ActiveRecord::Base
attr_accessible :email, :user_name, :password, :password_confirmation, :DateCreated,     :DateUpdated
alias_attribute :email, :Email
alias_attribute :user_name, :UserName
alias_attribute :remember_token, :RememberToken

self.table_name = "adm.User"
self.primary_key = "UserId"


has_secure_password
before_save { |user| user.email = email.downcase }
before_save { set_create_update_time}
before_save :create_remember_token

#validations
validates :user_name, presence: true, length: { maximum: 50 }
validates :password, presence: true, length: {minimum: 8}
validates :password_confirmation, presence: true

VALID_EMAIL_REGEX = 
/\A[\w+\-.]+@[ a-z\ d\-.]+\.[a-z]+\z/i
#  validates :email, presence: true, format: { with: VALID_EMAIL_REGEX }, uniqueness: {    case_sensitive: false} 



private 
  def create_remember_token
  # Create the token
  self.remember_token = SecureRandom.urlsafe_base64

结尾

def set_create_update_time
 self.DateCreated = created_at
 self.DateUpdated = updated_at
end

end

任何帮助将不胜感激,谢谢!

4

2 回答 2

0

您应该使用self.created_atself.updated_at。只有这样才能访问对象(用户记录)的实例属性。

而且你可能想要做一个after_update回调来更新DateUpdated属性。

我可以知道您为什么要创建别名并更改命名样式吗?在 Rails 中,attribute_name对属性和方法使用样式以及MyClass对类使用样式是一种惯例。

于 2013-11-08T05:24:01.607 回答
0

如您所知,如果您的模型具有字段created_at并且updated_at名称与此完全相同,那么 ActiveRecord 将相应地设置/更新它们。在您的情况下,由于您有自己的属性,因此您需要手动更新它们。

你在正确的轨道上。您的问题是,在右侧,您引用了一个不存在的方法/变量created_at——这就是那个异常所说的。

我会像这样进行回调 - 将属性设置为当前时间:

before_create :set_created_at
before_save :set_updated_at

def set_created_at
  if DateCreated.blank?
    self.DateCreated = Time.now.utc
  end
end

def set_updated_at
  self.DateUpdated = Time.now.utc
end
于 2013-11-08T05:33:28.597 回答