Как динамически добавить маршрут к ограниченному ресурсу в Rails3? - PullRequest
3 голосов
/ 21 марта 2011

сейчас я пытаюсь обобщить часть своего кода. Пока все прошло хорошо, я написал несколько миксов, которые я могу динамически добавлять в контроллеры или модели, чтобы добиться цели, подчиняясь СУХОЙ.

Но с моим "помощником по поисковой форме" я попал в угол, в котором сейчас я немного не в себе.

У меня есть 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 в приведенном выше примере кода. Но я до сих пор не выяснил, как это сделать ... Я имею в виду, на самом деле, я бы удивился, если бы это было невозможно.

У кого-нибудь есть идея, как это сделать? Заранее спасибо за любую идею, которая приводит к решению!

1 Ответ

1 голос
/ 27 марта 2011

Вы можете добавить работу вокруг стандартного динамического маршрута

match ':controller(/:action(/:id(.:format)))'

измени его на свои цели и наслаждайся:)

...