2013-04-30 134 views
1

我需要一些关于Ruby on Rails模型中实例变量和访问器范围的帮助。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还没有(有效的)URL方案,http://是默认前缀。
    • 如果作者未指定display_date,则使用Time.now

的问题是,所述author_url存取按预期方式工作,但display_date一个被视为方法内作用域的局部变量。如果我用一个块而不是一个单独的方法使用回调,则会发生同样的情况。

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

不过,我想知道为什么只发生一个属性,而不是其他发生。

回答

2

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

self.display_date ||= Time.now 

没有self.,它变得模糊,你是否希望创建一个局部变量或致电二传手,和Ruby选择创建默认局部变量。

不过,我想知道为什么这只发生一个属性,而不是其他发生。

因为你没有设置author_url任何东西;你只是调用一个方法,它是使用getter获取的。 author_url=二传手永远不会被调用。

+0

哦。你是对的。非常感谢! – tompave 2013-04-30 17:28:54