2013-04-30 131 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