Ruby on rails RubyonRails-Model';s属性和访问器范围

Ruby on rails RubyonRails-Model';s属性和访问器范围,ruby-on-rails,ruby,Ruby On Rails,Ruby,我需要一些关于RubyonRails模型中实例变量和访问器范围的帮助 下面是我的模型的简化(一篇博客文章)。 我已经删除了不相关的部分。当然,它有一组验证、关联和自定义方法 # Table name: articles # # author_url :string(255) # display_date :datetime class Article < ActiveRecord::Base attr_accessible :author_url, :display_date

我需要一些关于RubyonRails模型中实例变量和访问器范围的帮助

下面是我的模型的简化(一篇博客文章)。 我已经删除了不相关的部分。当然,它有一组验证、关联和自定义方法

# 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
#表名:文章
#
#作者地址:字符串(255)
#显示日期:日期时间
类文章
现在:

  • author\u url
    首先由验证器进行检查,以确保它以
    http://
    https://
    或无开头
  • 在创建对象时,应执行以下操作:
    • 如果
      author\u url
      还没有(有效的)url方案,默认情况下,
      http://
    • 如果作者未指明显示日期,则使用
      Time.now
问题是
author\u url
accessor按预期工作,但是
display\u date
one被视为方法范围内的局部变量。如果将回调与块而不是单独的方法一起使用,也会发生同样的情况

唯一可行的方法是使用
self.display\u date


尽管如此,我还是想知道为什么只对一个属性而不是另一个属性发生这种情况。

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

self.display_date ||= Time.now
如果没有
self.
,您是要创建局部变量还是调用setter就变得模棱两可,Ruby默认选择创建局部变量

尽管如此,我还是想知道为什么这只发生在一处房产上,而不是另一处房产

因为您没有将
author\u url
设置为任何内容;您只是对其调用一个方法,该方法是使用getter获取的。从不调用
author\u url=
setter