覆盖Rails中的渲染3 - 请求设计审查/代码重构

时间:2010-12-03 06:34:50

标签: ruby ruby-on-rails-3 controller render

我正在寻找一种可扩展的方法将功能注入控制器。

module Social
    module Request
        def self.included( base )
            base.alias_method_chain :render, :social
            base.alias_method_chain :process_action, :social
        end

        def process_action_with_social(method_name, *args)
            @action = method_name
            process_action_without_social(method_name, *args)
        end

        def render_with_social(action = nil, options = {}, &blk)
            if @action == "new"
                          # do something social
            end
            render_without_social
        end
    end
end

class RequestController < ApplicationController
    include Social::Request

    def new     
        @request = RecommendationRequest.new
    end
end

上面的代码正在运行,但我很确定它不是最佳的ruby。我将为每个控制器创建不同的模块,实际上可能是其中的一部分。每个控制器唯一唯一的代码是render_with_social。

所以我的问题是:

  1. 有没有办法把其他两种方法拉出来,所以我不能重复自己? (对不起,这是我第一次在ruby中使用模块)。
  2. 有没有办法做到这一点,而不必将包含Social :: Request放在RequestController中? (我希望能够删除这些模块,让我的控制器继续工作,好像什么都没发生一样)
  3. 如果我最终拥有这些Metrics :: Request,Scoring :: Request等的不同套件,那么在我指定哪些模块将被混合到哪个控制器的单个位置的最佳方法是什么?
  4. 谢谢大家。

0 个答案:

没有答案