插件中的虚拟属性

时间:2009-08-11 09:35:16

标签: ruby-on-rails ruby-on-rails-plugins virtual-attribute

我需要一些虚拟属性方面的帮助。这段代码工作正常,但我如何在插件中使用它。目标是将此方法添加到使用该插件的所有类中。

class Article < ActiveRecord::Base

  attr_accessor :title, :permalink

  def title
    if @title 
      @title
    elsif self.page
      self.page.title
    else 
      ""
    end
  end

  def permalink
    if @permalink
      @permalink
    elsif self.page
      self.page.permalink
    else
      ""
    end
  end
end

由于

3 个答案:

答案 0 :(得分:1)

您可以运行插件生成器以开始使用。

script/generate plugin acts_as_page

然后,您可以添加一个定义acts_as_page的模块,并将其扩展到所有模型中。

# in plugins/acts_as_page/lib/acts_as_page.rb
module ActsAsPage
  def acts_as_page
    # ...
  end
end

# in plugins/acts_as_page/init.rb
class ActiveRecord::Base
  extend ActsAsPage
end

这样,acts_as_page方法可用作所有模型的类方法,您可以在其中定义任何行为。你可以这样做......

module ActsAsPage
  def acts_as_page
    attr_writer :title, :permalink
    include Behavior
  end

  module Behavior
    def title
      # ...
    end

    def permalink
      # ...
    end
  end
end

然后当你在模型中调用acts_as_page时......

class Article < ActiveRecord::Base
  acts_as_page
end

它将定义属性并添加方法。如果您需要更加动态的东西(例如,如果您希望acts_as_page方法采用更改行为的参数),请尝试我在this Railscasts episode中提供的解决方案。

答案 1 :(得分:0)

您似乎想要一个模块用于此

# my_methods.rb 
module MyMethods
  def my_method_a
    "Hello"
  end
end

您希望将其包含在要用于它的类中。

class MyClass < ActiveRecord::Base
  include MyMethods
end

> m = MyClass.new
> m.my_method_a
=> "Hello!" 

有关混合模块的更多信息,请查看here。如果你愿意,你可以把模块放在插件的任何地方,只要确保它的名字正确,这样Rails就可以找到它。

答案 2 :(得分:0)

创建一个类似YourPlugin::InstanceMethods的模块结构,并将此模块包含在内:

module YourPlugin
  module InstanceMethods
    # your methods
  end
end

ActiveRecord::Base.__send__(:include, YourPlugin::InstanceMethods)

您必须使用__send__使您的代码与Ruby 1.9兼容。 __send__行通常放在插件根目录的init.rb文件中。