【问题标题】:In Rails, how can I share a private method to nested controllers?在 Rails 中,如何将私有方法共享给嵌套控制器?
【发布时间】:2015-11-14 16:49:02
【问题描述】:

我有一个Player 资源,其中包含各种嵌套资源,例如:MeasurableWorkout

我有一个变量用于他们页面上的 Player 标题,并且无论我是从 Player_Controller 还是从其他嵌套资源控制器之一访问操作,我都需要设置一个变量。我怎样才能干掉我的代码以在某处添加该变量,这样我就不必在每个控制器中包含相同的代码......如下所示:

播放器控制器

class PlayersController < ApplicationController
   before_action :set_measurable_summary

   #...

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

锻炼控制器

class Players::WorkoutsController < ApplicationController
   before_action :set_measurable_summary

   #...

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

【问题讨论】:

    标签: ruby-on-rails controller action nested-resources


    【解决方案1】:

    这可以通过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
    

    【讨论】:

      【解决方案2】:

      您可以将该方法移至ApplicationController

      class ApplicationController < ActionController::Base
      
        private
      
        def set_measurable_summary
          @measurable_summary = @player.measurable_summary
        end
      end
      

      【讨论】:

      • 只有在(几乎)所有控制器中都使用此方法时才是正确的方法。否则,当代码库增长时,开始为ApplicationController 中的某些控制器添加共享方法会打开地狱之门......
      【解决方案3】:

      您可以使用扩展控制器来获取父私有方法。请这样做:

      class Players::WorkoutsController < PlayersController
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-15
        • 1970-01-01
        相关资源
        最近更新 更多