在助手子类中包含帮助器,保留控制器上下文功能

时间:2012-09-20 04:09:14

标签: ruby-on-rails ruby dependency-injection helper

实际上,这是我的问题。我有一个带有MainController,HttpHelper和ServiceHelper的rails应用程序。

main_controller.rb

class MainController < ApplicationController
    include ServiceHelper
    def my_method
        Service.make_stuff
    end
end

service_helper.rb

module ServiceHelper
    class Service
        include HttpHelper
        def self.make_stuff
            http__foo
        end
    end
end
Service = ServiceHelper::Service

http_helper.rb

module HttpHelper
    def http__foo
        #stuff
        params[:bar].nil?
    end
end

如果一切正常,这段代码应该告诉我:bar param是否存在,但是我有问题。首先,此代码不起作用,它告诉我http__foo未定义,当然因为服务中的include HttpHelper不起作用。

我的第二个问题是,如果包含有效,params变量可能会出现问题。如果我在控制器中调用此方法(http__foo),它会没问题,但是我从子类中调用它,然后我不确定它是否可靠。

2 个答案:

答案 0 :(得分:1)

make_stuff是一种类方法。 http_foo是一种实例方法。因此,当您从http__foo拨打make_stuff时,就像调用未定义的Service.http_foo()一样。定义的是Service.new.http_foo()

我不知道你想做什么,但是在我的拙见中,通过观察你的代码,你似乎并不熟悉Rails MVC concept并创建MainController(为什么不使用ApplicationController?),以及你使用助手的方式对我来说很奇怪。从头开始重启可能是个好主意。

答案 1 :(得分:0)

oldergod对于类与实例方法问题是正确的。另外,params是ActionControllor中定义的方法,它位于所有控制器的继承树之上。 params方法将不在服务中(在服务中包含HttpHelper时它最终会出现),除非你把它作为ActionController或ApplicationController的子类,这有点奇怪,因为它不是一个控制器。