2012-05-14 26 views
0

我在models/extensions/url.rb获得了该文件:扩展与顾虑轨道模型

module Extensions 
    module Url 
    extend ActiveSupport::Concern 

    included do 
    end 

    module ClassMethods 
     def acts_as_url(attribute) 
     end 
    end 

    module InstanceMethods 
    end 
    end 
end 

然后,我可能有一个模型,看起来像:

class Post 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Extensions::Url 

    acts_as_url :title 

    field :title, :type => String 
end 

凡扩展模块中我可以做它使每个实例都有一个方法/访问者,名为url,以便我可以访问:title字段(作为属性参数传递)并能够执行:

post = Post.find(params[:id]) 
puts post.url 

回答

0

只需在Url模块内部和ClassMethods模块外部定义url方法即可。在那里定义的任何东西都会被添加为实例方法。

你可以把它放在你的InstanceMethods模块中,但是Rails最近更新了ActiveSupport::Concern来处理ClassMethods模块以外的任何东西作为实例方法。

+0

好酷,很好的了解实例方法的位置 - 我想我的问题更多地是关于如何动态访问:title字段(不直接引用标题,而是引用引用该字段的变量)。 – Matthew

+0

如果将其设置为Post对象的属性,则可以在'url'方法中使用'self.title'。 –

+0

我的url方法在类上,属性是动态引用的。所以对于一个类,它可能需要引用'self.title',但对于另一个类可能是'self.other_field'。 – Matthew