【问题标题】:Rails: DRYing up before_actionRails:干掉 before_action
【发布时间】:2016-03-15 13:53:35
【问题描述】:

我有几个控制器:

class First < ApplicationController
   before_action: do_this
   before_action: do_this_too
end

class Second < ApplicationController
  before_action: do_this
  before_action: do_this_too
end

class Third < ApplicationController

end

两个控制器有相同的before_action 的方法。如何干掉这段代码,以便FirstSecond 类在一个位置使用before_action 而不是Third 类?

我正在考虑某种类继承解决方案。有任何想法吗?在我的真实示例中,我有更多类,每个类都有多个相同的before_actions

【问题讨论】:

  • 您可以创建一个模块来定义这些before_action 回调并将该模块包含在每个需要它的控制器中,或者使用继承并创建一个父控制器
  • 我不会在 before_action 得到未定义的方法吗?行动之前不是类方法吗?如果没有,我应该把它放在哪里?
  • 你可以在这里找到一个例子:stackoverflow.com/questions/27867124/…
  • 不要,就这样吧。很清楚,很明显,很简单。将它放在一个模块中并不会改善事情。 include BeforeActions + 那个文件真的比两行好吗?恕我直言,它不是。由于此示例非常抽象,您可以做的一件事是创建第三个do_both 方法,该方法调用do_thisdo_this_foo。但这只有在这些方法以某种方式“属于”在一起时才有意义(即:do_this_and_foo)。
  • @Carpetsmoker 我知道伙计,我知道。你正在向合唱团布道。我没有问它是否更好,我问的是如何做到这一点。我 100% 同意您和以下评论者的意见。

标签: ruby-on-rails ruby ruby-on-rails-4


【解决方案1】:

我相信最好保持现状。如果您将这些 before_action 移动到模块或类似的东西,它将使您的控制器更难阅读和理解正在发生的事情。

换句话说,你会干燥你的控制器,但也会违反 KISS 原则(保持简单)。

但如果你还是想这样做,方法如下:

module SharedBeforeActions
  def self.included(base)
    base.before_action :do_this
  end

  def do_this
    # Your filter definition here
  end
end

class Third < ApplicationController
  include SharedBeforeActions
end

最后你必须配置 Rails 来加载你的模块:

# config/application.rb
config.autoload_paths += %W(#{config.root}/lib)

【讨论】:

  • 您在答案的文本中提到了它,但没有在代码中提到。我相信before_action 是现在的首选方法。
  • 谢谢@yez,我忘记改了
猜你喜欢
  • 2016-02-04
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多