在其他控制器中调用控制器的方法(保持DRY)
问题描述:
我对Rails稍微陌生(即愚蠢且需要一些教导)。在其他控制器中调用控制器的方法(保持DRY)
我有一个控制器(称为ControllerFoo
),执行一个特定的任务(theMethod
),这可能在其他控制器(例如,从ControllerBar
)有用。所以,当然,该方法被定义为self.theMethod
在ControllerFoo
(这意味着它是一个类方法,对吗?),并在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
答
几个选项...
- 把共享方法在共享父ApplicationController中
- 创建模块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
答
你这样做的方式是红宝石将创建包含要共享,并将其纳入你必须定义这些方法的类的类(或实例)方法的模块。
我实际上想到了这两种选择,所以我猜我没有我想象的那么糟糕:)接下来是一个问题:理论上的'theMethod'是一个创建操作。你会继续吗? –
将复杂的代码移动到模型或库中。您始终可以同时创建新控制器并调用常用方法。目标是保持你的控制器方法非常短。 – DGM
我对这个问题有点困惑。对于我将影响代码组织的创建操作,有什么特别之处?整个行动是完全一样的吗?如果是这样,为什么它在单独的控制器? –