2015-11-14 1 views
2

У меня есть ресурс Player, который имеет различные вложенные ресурсы, такие как: Measurable и Workout.В Rails, как я могу совместно использовать частный метод для вложенных контроллеров?

У меня есть переменная, которая используется на заголовке Player на своих страницах, и у меня есть переменная. Мне нужно установить, выполняю ли я действие с Player_Controller или с одного из других контроллеров вложенных ресурсов. Как я могу высушить мой код, чтобы добавить эту переменную где-то так, что я не должен включать в себя такой же, как кода в каждом контроллере ... как показано ниже:

PlayerController

class PlayersController < ApplicationController 
    before_action :set_measurable_summary 

    #... 

    private 
    def set_measurable_summary 
     @measurable_summary = @player.measurable_summary 
    end 
end 

WorkoutController

class Players::WorkoutsController < ApplicationController 
    before_action :set_measurable_summary 

    #... 

    private 
    def set_measurable_summary 
     @measurable_summary = @player.measurable_summary 
    end 
end 

ответ

3

Это можно легко сделать с помощью concern:

# app/controllers/concerns/measurable_summary.rb 

module MeasurableSummary 
    extend ActiveSupport::Concern 

    included do 
    before_action :set_measurable_summary 
    end 

    private 

    def set_measurable_summary 
    @measurable_summary = @player.measurable_summary 
    end 
end 

Затем включите его в свои контроллеры:

class PlayersController < ApplicationController 
    include MeasurableSummary 
    ... 
end 

class Players::WorkoutsController < ApplicationController 
    include MeasurableSummary 
    ... 
end 
0

Вы можете переместить этот метод ApplicationController

class ApplicationController < ActionController::Base 

    private 

    def set_measurable_summary 
    @measurable_summary = @player.measurable_summary 
    end 
end 
+1

Только правильный способ, если этот метод используется почти всеми контроллерами. В противном случае начало добавления общих методов для некоторых контроллеров внутри 'ApplicationController' открывает дверь в ад, когда кодовая база растет ... – Markus

0

Вы можете использовать расширения контроллера, чтобы получить родительский частный метод. Пожалуйста, сделайте следующее:

class Players::WorkoutsController < PlayersController 
end