2017-02-02 35 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

在某些情況下 - 這是一個決定,但我具有非常不同的功能(圖像,視頻,文章等)的空洞,但查找用戶,投票,答案等方法是完全相同的。我知道我需要某種模塊,但現在我確定知道我需要關注! –