【问题标题】:Include helper in a helper subclass keeping controller context functions在保持控制器上下文功能的助手子类中包含助手
【发布时间】:2012-09-20 04:09:14
【问题描述】:

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

ma​​in_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 参数是否存在,但我有问题。首先,这段代码不起作用,它告诉我http__foo 没有定义,肯定是因为Service 中的include HttpHelper 不起作用。

我的第二个问题是,如果包含工作,params 变量可能会有问题。如果我在控制器中调用这个方法(http__foo)就可以了,但是我从子类中调用它,那么我不确定它是否可靠。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 好的,谈论模块的实例似乎很奇怪,但我终于明白你在包含之后谈论它。我只是在尝试一些技巧,MVC 不是问题,我只是在尝试自定义助手,但这是个坏主意;)
    【解决方案2】:

    oldergod 关于类与实例方法的问题是正确的。此外,params 是在 ActionControllor 中定义的方法,它位于所有控制器的继承树之上。 params 方法在 Service 中将不可用(当您在 Service 中包含 HttpHelper 时它会结束),除非您将其设为 ActionController 或 ApplicationController 的子类,这会有点奇怪,因为它不是控制器。

    【讨论】:

      猜你喜欢
      • 2020-04-24
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 2019-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多