2017-02-02 40 views
1

我在Rails 5.0上。 创建新的控制器,并添加越来越多的代码中有我发现,我有相当多的在每个类的私有部分相同的方法,如如何使用私有方法保持DRY?

private 

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

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

def find_group 
    ... 
end 

等。

有什么办法可以将“标准”私有方法集包含到所有需要它的类中?

+0

如果你认为你正在使用这些方法与动作,你可以只移动代码在一个方法 –

+0

OK,在某些情况下,它是有道理的,但它仍然在许多课程中重复。 –

+0

@AlexanderGorg如果您想干燥控制器代码,并且此方法在其他控制器中也很有用,您可以创建帮助程序,并且可以将该帮助程序包含在控制器中。 – ashvin

回答

2

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

只需定义一个名为Finders的东西或app/controllers/concerns/finders.rb然后include Finders即可使用它。

还要注意,由于红宝石2.0 def实际上返回与方法名的象征,所以它是可以做到像下面这样:

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

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

虽然这是真的,这将导致略多打字,这是比类级别访问修饰符更明确,更不容易出错。

+0

真的很酷! –

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

+1

在某些情况下 - 这是一个决定,但我具有非常不同的功能(图像,视频,文章等)的空洞,但查找用户,投票,答案等方法是完全相同的。我知道我需要某种模块,但现在我确定知道我需要关注! –