我是Rails的新手,并且拥有一个包含每个表中的DateCreated和DateUpdated列的旧数据库。我想在模型中使用builtin created_at和updated_at属性在保存之前设置这些字段,但我的尝试产生:
NoMethodError(未定义的方法created_at' for #<Class:0x00000102b74d20>):
app/models/user.rb:45:in
set_create_update_time'
app / models / user.rb:24:in block in <class:User>'
app/controllers/users_controller.rb:15:in
create'
型号代码:
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
任何帮助都会非常感谢,谢谢!
答案 0 :(得分:0)
您应该使用self.created_at
和self.updated_at
。只有这样才能访问对象(用户记录)的实例属性。
此外,您可能还需要执行after_update
回调来更新DateUpdated
属性。
我可以知道为什么要创建别名并更改命名方式吗? Rails中的一个约定是为属性和方法使用attribute_name
样式,为类使用MyClass
样式。
答案 1 :(得分: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