сейчас я пытаюсь обобщить часть своего кода. Пока все прошло хорошо, я написал несколько миксов, которые я могу динамически добавлять в контроллеры или модели, чтобы добиться цели, подчиняясь СУХОЙ.
Но с моим "помощником по поисковой форме" я попал в угол, в котором сейчас я немного не в себе.
У меня есть mixin 'SearchIndexController', который добавляет методы, необходимые для поиска данных в таблице searchindex.
После включения миксина я могу инициализировать поисковые действия в соответствующем контроллере, вызывая этот метод:
def init_searchaction(object, name=nil)
singular = object.to_s.classify
plural = singular.pluralize
name = "search_#{singular}".to_sym if name.nil?
unless self.respond_to?(name)
define_method(name) do
# init
success=false
#TODO
# >>> DRAW NEW ROUTE TO THIS ACTION <<<
# evaluate searchform input for Searchindex-Call
needle = params[:query]
success, x, notice = execute_search("#{singular}", needle)
# send selected/filtered data to page
respond_to do |format|
format.js {
render :update do |page|
page.call "sidx_updateSearchResultContentAtIdTag", "##{plural.downcase} tbody", "#{render x}" if success
page.call "sidx_updateNotice", success, "#{notice}"
page.call "sidx_stopSpinner"
end
}
end
end
else
logger.warn("#{__FILE__}:#{__LINE__}:#{self.to_s}: search-action for '#{self.class.name}' can not be created, it already exists!")
end
end
Допустим, у меня есть пользовательский контроллер. В пользовательской форме мне нужно искать несколько объектов. Давайте предположим, что я хочу иметь возможность поиска пользователей, отделов и клиентов ... с моим миксином, мне просто нужно инициализировать поисковые операции следующим образом:
init_searchaction :user
init_searchaction :department
init_searchaction :client, :find_clients
это создаст действия внутри включающего контроллера, которые называются
search_user
search_department
find_clients
Единственное, чего не хватает, так это способа найти для них маршрут. Я не хочу определять маршрут заранее. Я просто хочу, чтобы init_searchaction и mixin создали необходимый маршрут.
Итак ... возможно ли добавить маршрут к соответствующему поисковому действию из-за динамического исключения метода mixins init_searchaction? Я думаю, что необходимый код будет размещен на отметке #TODO в приведенном выше примере кода. Но я до сих пор не выяснил, как это сделать ... Я имею в виду, на самом деле, я бы удивился, если бы это было невозможно.
У кого-нибудь есть идея, как это сделать? Заранее спасибо за любую идею, которая приводит к решению!