Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在Ruby中重写模块?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在Ruby中重写模块?

Ruby on rails 在Ruby中重写模块?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我在vendor/{engine}/app/helpers/application\u helper.rb中有此代码: module ApplicationHelper def application_title() "Foo" end def other_method() # ... end end module ApplicationHelper def application_title() "Bar" end end 这在app/he

我在
vendor/{engine}/app/helpers/application\u helper.rb
中有此代码:

module ApplicationHelper
  def application_title()
    "Foo"
  end

  def other_method()
    # ...
  end
end
module ApplicationHelper
  def application_title()
    "Bar"
  end
end
这在app/helpers/application\u helper.rb中:

module ApplicationHelper
  def application_title()
    "Foo"
  end

  def other_method()
    # ...
  end
end
module ApplicationHelper
  def application_title()
    "Bar"
  end
end

从我的应用程序调用
application\u title()
时,我得到了预期的“Bar”,但我的应用程序无法看到
other\u method()
。我如何修改ApplicationHelper来解决这个问题?

我不能肯定这是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)
期望的结果


也许您可以修改
app/helpers/application\u helper.rb
以在加载路径中搜索其他application\u helper.rb文件并加载它们?

我认为问题在于您希望引擎中的帮助程序超过主应用程序中的帮助程序。我相信这在引擎插件中是有效的,但在Rails2.3中没有引入这一功能

代码混合

Rails 2.3不尝试执行以下任何操作: 发动机的“代码混合” 插件可以。对于那些不在 要知道,这就是功能 这样,您的应用程序就可以覆盖 控制器或控制器中的单个方法 助手,而不必复制 从插件到您的 应用程序

我不能肯定,但我怀疑 这项功能将永远成为 Rails本身,老实说,我 我想这可能是件好事。 而代码混合机制是 很好,还有其他的方法 凌驾于 更具代表性的方法 红宝石色,魔法少。我会 试着尽快在这里发布一些例子


希望这能有所帮助。

嗯。。。我不明白为什么会这样。您确定第一个ApplicationHelper包含在您的项目中吗?如果你删除你的
应用程序\u标题
,你会得到“Foo”吗。您确定帮助程序确实包含在您的应用程序中吗?删除应用程序\u title()方法会导致一个错误,即未定义应用程序\u title()。但是如果我完全删除模块,我会得到“Foo”。也可以查看引擎如何工作的示例。具体地说,步骤5显示了将助手从引擎包含到项目助手中。好吧,那真是一个糟糕透顶的人。我真的希望我能使用这个功能。有更聪明的做事方式吗?