在其他控制器中调用控制器的方法(保持DRY)

时间:2011-09-30 16:53:12

标签: ruby-on-rails ruby

我对Rails有点新手(即愚蠢,需要一些教学)。

我有一个执行特定任务(ControllerFoo)的控制器(称为theMethod),这可能在其他控制器中有用(例如,来自ControllerBar内)。那么,当然,该方法在self.theMethod中定义为ControllerFoo(这意味着它是一种类方法,对吧?),并在ControllerBar中以ControllerFoo.theMethod的形式进行访问。困惑了吗?

问题在于:ControllerFoo.theMethod使用会话数据,从ControllerBar调用时,会话为零。实际上,从自身调用时,似乎会话也是零。我想我所说的是类方法无法访问会话数据?

< rant> 我讨厌如何不能像在PHP中那样简单地访问会话数据< / rant>

所以现在,由于我不够聪明,不知道如何正确地做到这一点,我只是在我的应用程序的几个地方复制了逻辑。但这根本不是干的,我讨厌它。

那么如何在控制器中创建一个可供其他控制器访问的方法,并且还可以访问会话数据?

class ControllerFoo < ApplicationController
    def self.theMethod (greeting)
        p "#{greeting} #{session[:user]}!"
    end
end

class ControllerBar < ApplicationController
    def show
        ControllerFoo.theMethod("Hello,")
    end
end

2 个答案:

答案 0 :(得分:5)

几种选择......

  1. 将共享方法放在共享父ApplicationController
  2. 创建一个ControllerFoo和ControllerBar都包含的模块
  3. e.g。

    module SharedModule
        def theMethod (greeting)
            p "#{greeting} #{session[:user]}!"
        end
    end
    class ControllerFoo < ApplicationController
        include SharedModule
    end
    
    class ControllerBar < ApplicationController
        include SharedModule
        def show
            theMethod("Hello,")
        end
    end
    

答案 1 :(得分:1)

你要这样做的方法是Ruby创建一个包含你想要共享的类(或实例)方法的模块,并将它包含在你需要定义这些方法所需的类中。