我需要一些虚拟属性方面的帮助。这段代码工作正常,但我如何在插件中使用它。目标是将此方法添加到使用该插件的所有类中。
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
由于
答案 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
文件中。