Ruby On Rails - 模型的属性和访问器范围

时间:2013-04-30 17:16:18

标签: ruby-on-rails ruby

我需要一些关于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://
    • 如果作者未指明display_date,则使用Time.now

问题是author_url访问器按预期工作,但display_date访问器被视为方法范围内的局部变量。如果我使用块而不是单独的方法使用回调,也会发生同样的情况。

使其运作的唯一方法是使用self.display_date

不过,我想知道为什么只有一个属性而不是另一个属性。

1 个答案:

答案 0 :(得分:2)

您需要使用self.来调用当前对象的setter。

self.display_date ||= Time.now

如果没有self.,是否要创建局部变量或调用setter变得模棱两可,Ruby默认选择创建局部变量。

  

不过,我想知道为什么只有一个属性而不是另一个属性。

因为您没有将author_url设置为任何内容;你只是在它上面调用一个方法,它是使用getter获取的。永远不会调用author_url= setter。