2011-09-30 60 views
1

我对Rails稍微陌生(即愚蠢且需要一些教导)。在其他控制器中调用控制器的方法(保持DRY)

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

问题出在这里:ControllerFoo.theMethod使用会话数据,当从ControllerBar调用时,会话为零。实际上,从本身来看,会话似乎也是零。我猜我在说的是类方法不能访问会话数据?

<咆哮> 我恨如何会话数据不能简单地在任何地方像PHP < /咆哮>

所以现在访问,因为我不是足够聪明,知道如何正确地做到这一点,我刚刚在我的应用程序的几个地方重复了逻辑。但这根本不是干的,我讨厌它。

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

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

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

回答

5

几个选项...

  1. 把共享方法在共享父ApplicationController中
  2. 创建模块ControllerFoo和ControllerBar都将包括

例如

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 
+0

我实际上想到了这两种选择,所以我猜我没有我想象的那么糟糕:)接下来是一个问题:理论上的'theMethod'是一个创建操作。你会继续吗? –

+0

将复杂的代码移动到模型或库中。您始终可以同时创建新控制器并调用常用方法。目标是保持你的控制器方法非常短。 – DGM

+0

我对这个问题有点困惑。对于我将影响代码组织的创建操作,有什么特别之处?整个行动是完全一样的吗?如果是这样,为什么它在单独的控制器? –

1

你这样做的方式是红宝石将创建包含要共享,并将其纳入你必须定义这些方法的类的类(或实例)方法的模块。

相关问题