2009-06-17 69 views
0

我有这样的代码vendor/{engine}/app/helpers/application_helper.rbRuby中的重载模块?

module ApplicationHelper 
    def application_title() 
    "Foo" 
    end 

    def other_method() 
    # ... 
    end 
end 

而这app/helpers/application_helper.rb

module ApplicationHelper 
    def application_title() 
    "Bar" 
    end 
end 

我得到“酒吧”从我的应用程序调用application_title()时如预期,但我的应用程序不能看到other_method() 。我如何修改ApplicationHelper来解决这个问题?

+0

嗯...我不明白为什么会如此。你确定第一个ApplicationHelper被包含在你的项目中吗?如果你删除你的`application_title`,你会得到“Foo”吗? – 2009-06-17 17:16:26

+0

。你确定帮手是否真的被包含在你的应用中? – cpjolicoeur 2009-06-17 17:17:46

回答

0

我认为这个问题是你期望在你的发动机的助手在此改变一个主应用程序。我相信这曾在引擎插件,但对Rails 2.3此功能在没有提起。

http://rails-engines.org/news/2009/02/02/engines-in-rails-2-3/

代码混合

的Rails 2.3不尝试做任何的 的“代码混合”的引擎 插件一样。对于那些你不 就知道了,这是功能 ,让您的应用程序覆盖控制器或 帮手 单一的方法,而不必从插件 整个文件复制到你的应用程序 。

我不能肯定地说,但我怀疑 此功能将永远使它成为 Rails的本身,老实说,我 认为这可能是一件好事。 虽然代码混合机制 相当整齐,有压倒一切的 方法,这是更典型的 Rubyish,并涉及较少魔实施 其他方式。我会 尝试在这里很快发布一些例子。

希望这会有所帮助。

0

我不能肯定地说,这是Rails的问题,但我的猜测是,这是不离谱。在Rails应用程序的情况下,最后的“修复”可能不容易应用。

首先,目录列表:

> ls -R 
.: 
bar_then_foo.rb bar_then_foo2.rb foo_then_bar.rb lib_foo lib_fubar 

./lib_foo: 
helper.rb 

./lib_fubar: 
helper.rb 

助手模块:

> cat lib_foo/helper.rb 
module Helper 
    def foo 
    puts "foo" 
    end 

    def bar 
    puts "bar" 
    end 
end 

> cat lib_fubar/helper.rb 
module Helper 
    def foo 
    puts "foo-bar" 
    end 
end 

的Ruby代码:

> cat bar_then_foo.rb 
$LOAD_PATH.unshift File.dirname(__FILE__) + '/lib_fubar' 
$LOAD_PATH.unshift File.dirname(__FILE__) + '/lib_foo' 

require 'helper' 

class FoobieDoo 
    include Helper 
end 

f = FoobieDoo.new 
f.foo 
f.bar 

> cat foo_then_bar.rb 
$LOAD_PATH.unshift File.dirname(__FILE__) + '/lib_foo' 
$LOAD_PATH.unshift File.dirname(__FILE__) + '/lib_fubar' 

require 'helper' 

class FoobieDoo 
    include Helper 
end 

f = FoobieDoo.new 
f.foo 
f.bar 

和一些输出:

> ruby bar_then_foo.rb 
foo 
bar 

> ruby foo_then_bar.rb 
foo-bar 
foo_then_bar.rb:12: undefined method 'bar' for #<FoobieDoo:0x1042e93c> (NoMethodError) 

因此Ruby从终端搜索$ LOAD_PATH并尽快找到一个匹配停止。

让我们尝试别的东西:

> cat bar_then_foo2.rb 
$LOAD_PATH.unshift File.dirname(__FILE__) + '/lib_fubar' 
$LOAD_PATH.unshift File.dirname(__FILE__) + '/lib_foo' 

require 'helper' 
load "lib_fubar/helper.rb" 

class FoobieDoo 
    include Helper 
end 

f = FoobieDoo.new 
f.foo 
f.bar 

> ruby bar_then_foo2.rb 
foo-bar 
bar 

期望的结果?

也许你可以修改app/helpers/application_helper.rb来搜索LOAD_PATH中的其他application_helper.rb文件并加载它们?