如何使用私有方法保持 DRY?

How to stay DRY using private methods?

我正在使用 Rails 5.0。 创建新的控制器并在其中添加越来越多的代码我发现我在每个 class 的私有部分中有很多相同的方法,例如

private

def find_post
  @post = Posts.find(params[:id])
end

def find_user
  @user = User.find(params[:id])
end

def find_group
  ...
end

等等。

有什么方法可以为所有需要它的 class 包含一组 "standard" 私有方法吗?

您可以像在模型中一样在控制器中使用 concerns

只需在 app/controllers/concerns/finders.rb 中定义一个名为 Finders 或其他名称的关注点,然后 include Finders 即可使用它。

另请注意,由于 Ruby 2.0 def 实际上是 returns 带有方法名称的符号,因此可以执行以下操作:

private def find_post
  @post = Posts.find(params[:id])
end

private def find_user
  @user = User.find(params[:id])
end

虽然这确实会导致输入稍微多一些,但它比 class 级别访问修饰符更明确且更不容易出错。

你能不能只从父控制器继承,而是使用受保护的方法?

class PostParentController < ApplicationController
  before_filter :find_user # might be a different method name in Rails 5
  before_filter :find_post

  protected
  def find_post
    @post = Posts.find(params[:id])
  end

  def find_user
    @user = User.find(params[:id])
  end
end

子类:

class PostChildController < PostParentController
  def show
  end

  def create
  end

  # etc
end 

Ruby public, private, protected methods