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