1

Railsアプリでacts_as_commentableを使用して、さまざまなタイプのモデルにコメントできるようにしています。

ポリモーフィックCommentsControllerアラポリモーフィック アソシエーション Railscastがあります。

このコントローラーの仕様を書こうとしています。ただし、 acts_as_fuを使用して、コントローラーが仕様で使用するジェネリックCommentableクラスを定義したいと考えています。このようにして、具体的なコメント可能なモデルの 1 つに結び付けられません。

Commentable問題は、コントローラー アクションをテストしようとすると、 acts_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

更新:「ハッキーな」ソリューションが見つかりました。しかし、これを行うためのよりクリーンな方法があるかどうか疑問に思っています。

4

1 に答える 1

2

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
于 2013-09-09T21:03:29.020 に答える