我需要一些关于Ruby on Rails模型中实例变量和访问器范围的帮助。
这是我的模型的简化(博客文章)。 我删除了无关的部分。当然它有一组验证,关联和自定义方法。
# Table name: articles
#
# author_url :string(255)
# display_date :datetime
class Article < ActiveRecord::Base
attr_accessible :author_url, :display_date
# callbacks
before_create :prepare_properties
# validations
VALID_URL_REGEX = /\Ahttps?:\/\/.+/i
validates :author_url, format: { with: VALID_URL_REGEX,
message: " can only use http:// or https:// schemes",
if: Proc.new { author_url.include?("://") } }
private
def prepare_properties
display_date ||= Time.now
author_url.prepend("http://") unless author_url =~ /\Ahttps?:\/\//i
end
end
现在:
author_url
首先使用验证程序进行检查,以确保其以http://
,https://
或任何内容开头。author_url
还没有(有效)网址方案,则默认情况下会先加http://
。Time.now
。问题是author_url
访问器按预期工作,但display_date
访问器被视为方法范围内的局部变量。如果我使用块而不是单独的方法使用回调,也会发生同样的情况。
使其运作的唯一方法是使用self.display_date
。
不过,我想知道为什么只有一个属性而不是另一个属性。
答案 0 :(得分:2)
您需要使用self.
来调用当前对象的setter。
self.display_date ||= Time.now
如果没有self.
,是否要创建局部变量或调用setter变得模棱两可,Ruby默认选择创建局部变量。
不过,我想知道为什么只有一个属性而不是另一个属性。
因为您没有将author_url
设置为任何内容;你只是在它上面调用一个方法,它是使用getter获取的。永远不会调用author_url=
setter。