Rails [求助] 有段代码不太理解,求高手指点

flingjie · 2014年05月28日 · 最后由 chenge 回复于 2014年05月28日 · 1847 次阅读

有如下两个自定义的 model 类:

class Blog
  ...

  def add_entry(entry)
    @entries << entry
  end

  ...
end
# app/models/post.rb
class Post
  extend ActiveModel::Naming
  include ActiveModel::Conversion

  attr_accessor :blog, :title, :body, :pubdate

  def initialize(attrs = {})
    attrs.each do |k,v| send("#{k}=",v) end
  end

  def publish(clock = DateTime)
    self.pudate = clock.now
    blog.add_entry(self)     #   <=疑惑点?
  end

  def persisted?
    false
  end

end

不太明白 Post 中的 blog 是如何初始化为一个 Blog 的实例的,请高手指点或给个思路,谢谢~

def initialize(attrs = {})
  attrs.each do |k,v| send("#{k}=",v) end 
end

在这个时候初始化的,你看看实参 attr 里面有没有这样一个 Hash 的键值对,{ blog: a_blog_object }, 然后 self.blog = a_blog_object

@neverlandxy_naix @dddd1919 多谢!

搞清楚了,在 Blog 中初始化的

  ...
  def new_post(*args)
    post_source.call(*args).tap do |p|
      p.blog = self
    end
  end
  def post_source
    @post_source ||= Post.public_method(:new)
  end
  ...
end

还有个疑问,上面的 blog.add_entry(self) 没有@符号? 是不是这里使用的不是实例变量,而是一个方法?

#3 楼 @flingjie attr_accessor :blog,这个是类宏,就有一个 blog 方法了。

设计上讲,避免直接用@,减少耦合度。容易修改和扩展。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号