2015-04-02 47 views
0

我有這個文件夾結構的應用程序:使用const_missing指從模塊外部類

# /app/controllers/first_controller. 
class FirstController 
    def method 
    'External' 
    end 
end 

# /app/controllers/second_controller.rb 
class SecondController 
    def method 
    'External' 
    end 
end 

# /app/controllers/foo/first_controller.rb 
module Foo 
    class FirstController < ::FirstController 
    def method 
     'Internal' 
    end 
    end 
end 

我desidered行爲是:

Foo::FirstController#method => "Internal" 

Foo::SecondController#method => "External" 

所以,如果沒有定義控制器在模塊Foo,它應該實例化外部電子郵件

我試圖創建一個文件foo.rb

# /app/controllers/foo.rb 
module Foo 
    def self.const_missing(name) 
    "::#{name}".constantize 
    end 
end 

但是使用這個會讓rails忽略/app/controllers/foo/*.rb(根本不需要它們)定義的所有類。

我該如何獲得這個?

回答

1

只要讓Rails在Foo命名空間中存在該類時執行該任務。它採用const_missing太解析類的名字:

module Foo 
    def self.const_missing(name) 
    if File.exists?("app/controllers/foo/#{name.to_s.underscore}.rb") 
     super 
    else 
     "::#{name}".constantize 
    end 
    end 
end 

輸出:

Foo::FirstController.new.method 
# => "Internal" 
Foo::SecondController.new.method 
# => "External"