繁体   English   中英

不能在模型中包含模块

[英]Cannot include module in model

我正在使用

Ruby version              1.8.7
Rails version             3.0.3

我在 Rails 应用程序的每个模型中都有一个名为活着的方法:

  def alive
    where('deleter is null')  
  end   

我不想在每个模型中复制这段代码,所以我做了一个 /lib/life_control.rb

module LifeControl    
  def alive
    where('deleter is null')  
  end   

  def dead
    where('deleter is not null')  
  end    
end

在我的模型(例如 client.rb)中,我写道:

class Client < ActiveRecord::Base
  include LifeControl   
end

在我的 config/enviroment.rb 我写了这一行:

require 'lib/life_control'

但现在我得到一个无方法错误:

NoMethodError in
ClientsController#index

undefined method `alive' for
#<Class:0x10339e938>

app/controllers/clients_controller.rb:10:in
`index'

我究竟做错了什么?

include会将这些方法视为实例方法,而不是类方法。 你想要做的是:

module LifeControl    
  module ClassMethods
    def alive
      where('deleter is null')  
    end   

    def dead
      where('deleter is not null')  
    end    
  end

  def self.included(receiver)
    receiver.extend ClassMethods
  end
end

这样, alivedead将在类本身上可用,而不是在其实例上可用。

我知道这是一个很老的问题,接受的答案确实对我有用,但这意味着我必须重新编写大量代码,因为我必须将模块更改为嵌套模块。

这对我的情况有帮助,并且应该适用于当今的大多数应用程序。(不确定它是否适用于问题中的 ruby​​/rails 版本)

而不是include使用extend

因此,根据问题,示例代码如下所示:

class Client < ActiveRecord::Base
  extend LifeControl   
end

只需将此行放在 application.rb 文件中

config.autoload_paths += Dir["#{config.root}/lib/**/"]

编辑:

这条线对我来说很好用。 我想再提出一件事,ruby 1.8.x 与 rails 3.x 不兼容。 所以只需更新您的 ruby​​ 版本 1.9.2

以下是我的 POC

In lib folder:
lib/test_lib.rb

module TestLib
 def print_sm
   puts "Hello World in Lib Directory"
 end
end


In model file:

include TestLib
def test_method
  print_sm
end

And In application.rb

config.autoload_paths += Dir["#{config.root}/lib/**/"]


Now you can call test_method like this in controller:

ModelName.new.test_method #####Hello World in Lib Directory

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM