如何在Rails 3.2中动态添加路由

时间:2013-09-09 20:44:08

标签: ruby-on-rails ruby-on-rails-3 rspec acts-as-commentable

我在Rails应用中使用acts_as_commentable来允许对不同类型的模型进行评论。

我有一个多态CommentsController ala Polymorphic Association Railscast

我正在尝试为此控制器编写规范;但是,我想使用acts_as_fu来定义控件的通用Commentable类,以便在规范中使用。这种方式与我们具体的可评论模型无关。

问题是,当我尝试测试控制器操作时,我得到路由错误,因为我没有使用acts_as_fu创建的Commentable类的路由。

我需要一种方法来为这个动态创建的模型在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

更新:找到'hacky'解决方案。我想知道是否有一种更清洁的方式来做到这一点。

1 个答案:

答案 0 :(得分:2)

adding routes at runtime in Rails 3找到了一个解决方案,虽然是一个hacky:

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