0

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

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

谢谢

4

3 回答 3

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方法接受改变行为的参数),请尝试我在此 Railscasts 插曲中提出的解决方案。

于 2009-08-11T15:08:35.090 回答
0

创建一个像这样的模块结构YourPlugin::InstanceMethods并将其包含在这个模块中,如下所示:

module YourPlugin
  module InstanceMethods
    # your methods
  end
end

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

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

于 2009-08-11T13:49:49.437 回答
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!" 

在此处查看有关混合模块的更多信息。如果您愿意,您可以将模块放在插件中的任何位置,只需确保其名称正确,以便 Rails 可以找到它。

于 2009-08-11T13:16:37.467 回答