Переопределение рендера в Rails 3 - Запрос на пересмотр дизайна / рефакторинг кода - PullRequest
1 голос
/ 03 декабря 2010

Я ищу расширяемый способ внедрения функциональности в контроллер.

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. Есть ли способ сделать это без необходимости вообще включать include Social :: Request в RequestController?(Я хочу иметь возможность удалить эти модули, и чтобы мой контроллер продолжал работать, как будто ничего не произошло)
  3. Если я получу разные наборы этих метрик :: Запрос, Оценка :: Запрос и т. Д.,Каков наилучший способ приблизиться к наличию единого местоположения, где я указываю, какие модули будут смешиваться с какими контроллерами?

Спасибо всем.

...