在我的应用程序中,我使用了一个引擎(blogit),我想添加一些更改/行为。
我按照指南介绍了如何覆盖引擎控制器/模型,并添加了以下内容:
在config/initializer/blogit.rb
# Requires extension ruby files in lib/blogit.
Dir[Rails.root.join("lib/blogit/*.rb")].each {|f| require f}
在lib/blogit/engine.rb
module Blogit
class Engine < ::Rails::Engine
isolate_namespace Blogit
config.to_prepare do
Dir.glob(Rails.root + "app/decorators/**/blogit/*_decorator*.rb").each do |c|
require_dependency(c)
end
end
end
end
在app/decorators/controllers/blogit/comments_controller_decorator.rb
Blogit::CommentsController.class_eval do
def create
Rails.logger.info "decorated controller action"
# ... overridden stripped ...
end
end
在app/decorators/models/blogit/comment_decorator.rb
Blogit::Comment.class_eval do
belongs_to :user
end
待提及:
如果我运行rake
,我会收到奇怪的错误:
/Users/Kassi/.rvm/rubies/ruby-1.9.3-p392-railsexpress/bin/ruby -S rspec ./spec/controllers/home_controller_spec.rb ./spec/models/user_spec.rb
/Users/Kassi/demo/app/decorators/controllers/blogit/comments_controller_decorator.rb:3:in `<top (required)>': uninitialized constant Blogit::CommentsController (NameError)
但是,如果我运行rake手动提及的第一行(.../ruby -S ...
),则所有测试都正在成功运行。
在我的项目中,我正在使用 guard 和 spork 。跑卫也会让测试通过而没有任何错误。
应用程序本身运行良好,即它启动没有错误,我可以按我的意愿发表评论。我的装饰者动作代码正在执行。
运行 rake 时有什么不同? 为什么会破坏?
注意:
require "blogit"
或require "blogit/comments_controller"
无济于事。它实际上无法使用 require 找到控制器。由于这个问题是一个更大的项目的一部分,我从头开始创建一个新的应用程序用于测试,只包含相关的东西:基本的rails应用程序,rspec,设计,blogit和装饰器。 它可以在这里找到:https://github.com/kassi/decorator_demo_rspec(git://github.com/kassi/decorator_demo_rspec.git)
另一个使用testunit(工作正常!)的repo可以在这里找到:https://github.com/kassi/decorator_demo_testunit(git://github.com/kassi/decorator_demo_testunit.git)