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

时间:2017-02-02 06:21:11

标签: ruby-on-rails ruby controller dry private-methods

我在Rails 5.0上。 在那里创建新的控制器并添加越来越多的代码我发现在每个类的私有部分中我有很多相同的方法,比如

private

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

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

def find_group
  ...
end

等等。

有没有办法在需要它的所有类中包含一组“标准”私有方法?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

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

虽然这确实导致了更多的输入,但它比类级访问修饰符更明确,更不容易出错。

答案 1 :(得分:0)

您是否可以使用受保护的方法继承父控制器?

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