Как динамически добавлять маршруты в Rails 3.2

Я использую act_as_commentable в приложении Rails, чтобы комментировать различные типы моделей.

У меня полиморфный CommentsController аля Полиморфная Ассоциация Railscast.

Я пытаюсь написать спецификации для этого контроллера; Тем не менее, я хотел бы использовать acts_as_fu для определения общего Commentable класс для контроллера для использования в спецификации. Таким образом, он не привязан к одной из наших конкретных комментируемых моделей.

Проблема в том, что когда я пытаюсь проверить действия контроллера, я получаю ошибки маршрутизации, потому что нет маршрутов для Commentable класс, который я создал, используя act_as_fu.

Мне нужен способ рисовать маршруты для этой динамически созданной модели в before(:all) (используя, кстати, RSpec) для спецификаций.

Вот как выглядит моя спецификация:

describe CommentsController do
  before(:all) do
    # Using acts_as_fu to create generic Commentable class
    build_model :commentable do
      acts_as_commentable :comment
      belongs_to :user
      attr_accessible :user
    end

    # TODO - Initialize Commentable routes
  end
end

ОБНОВЛЕНИЕ: нашел "хакерское" решение. Мне интересно, есть ли более чистый способ сделать это все же.

1 ответ

Нашел решение для добавления маршрутов во время выполнения в Rails 3, хотя и хакерское:

describe CommentsController do
  before(:all) do
    # Using acts_as_fu to create generic Commentable class
    build_model :commentable do
      acts_as_commentable :comment
      belongs_to :user
      attr_accessible :user
    end

    # Hacky hacky
    begin
      _routes = Rails.application.routes
      _routes.disable_clear_and_finalize = true
      _routes.clear!
      Rails.application.routes_reloader.paths.each{ |path| load(path) }
      _routes.draw do
        # Initialize Commentable routes    
        resources :commentable do
          # Routes for comment management
          resources :comments
        end
      end
      ActiveSupport.on_load(:action_controller) { _routes.finalize! }
    ensure
      _routes.disable_clear_and_finalize = false
    end
  end
end
Другие вопросы по тегам