4

Rails 3.0.12 で Rails エンジンを構築していますが、エンジンのコントローラーの仕様を記述しようとすると、ルートに問題があります。

コンテキスト

私はEnginexレイアウトに従っています。エンジンには名前が付けられており、分離されFeaturingていません。それ自体ではルートを宣言しません。ファイルはありません。代わりに、メイン アプリケーションがエンジン固有のルートを定義するためのメソッドが提供されます。featuring/config/routes.rbroutes_for_feature

##
# featuring/lib/featuring/rails.rb
#
require 'featuring/rails/routing'

module Featuring
  class Engine < ::Rails::Engine
  end
end

##
# featuring/lib/featuring/rails/routing.rb
#
module ActionDispatch::Routing
  class Mapper

    def routes_for_feature(feature_name)
      resource_name = feature_name.to_s.pluralize.to_sym
      resources resource_name, :controller => "featuring/features", :only => [:index, :show], :feature => feature_name.to_s
    end
  end
end

Enginex テンプレートに従って、次のDummyようにルートを定義するアプリがあります。

# featuring/spec/dummy/config/routes.rb
Dummy::Application.routes.draw do
  routes_for_feature :feature_model
end

問題

Dummyappの rails サーバーを実行すると、すべて正常に動作します。参照できhttp://localhost:3000/feature_models、リクエストは成功しました。

を指定したいのですがFeaturing::FeaturesController、ルートを見つけることができません。

仕様は次のとおりです。

# featuring/spec/controllers/features_controller_spec.rb
require 'spec_helper'

describe Featuring::FeaturesController do

  context "feature_models" do
    it "GET index should be successful" do
      puts Rails.application.routes.routes
      get :index, { :use_route => "featuring", :feature => "feature_models" }
      response.should be_success
    end
  end
end

この仕様を実行した結果は次のとおりです。

rspec spec/controllers/features_controller_spec.rb:7
Featuring::FeaturesController
  feature_models
GET    /feature_models(.:format)                {:action=>"index", :controller=>"featuring/features"}
GET    /feature_models/:id(.:format)            {:action=>"show", :controller=>"featuring/features"}
    GET index should be successful (FAILED - 1)

Failures:

  1) Featuring::FeaturesController feature_models GET index should be successful
     Failure/Error: get :index, { :use_route => "featuring", :feature => "feature_models" }
     ActionController::RoutingError:
       No route matches {:feature=>"feature_models", :controller=>"featuring/features"}
     # ./spec/controllers/features_controller_spec.rb:8:in `block (3 levels) in <top (required)>'

ご覧のとおり、ルートが正しく定義されていても、仕様のコントローラーはそれらを見つけられないようです。

:で何かが私を驚かせRoutingErrorますNo route matches {:feature=>"feature_models", :controller=>"featuring/features"}action => "index"表示されません。

4

2 に答える 2

0

同様のエラーがあり、ルートオプションに {:action => "index"} がないことにも混乱しました。しかし、これは問題ではないことが判明しました。ActionDispatch は、:action の欠如を {:action => "index"} と同等のものとして扱います。見る:

https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/routing/route_set.rb#L545

私の場合のように、仕様にリクエストパラメーターが欠落している可能性があります。ブラウザーでページをロードするときに、サーバー ログのパラメーター行を確認します。

于 2012-06-08T16:01:18.513 に答える
0

秘訣はroutes { }、次のように仕様に追加することです。

describe Featuring::FeaturesController do
  routes { Featuring::Engine.routes }
  # ...
end

No Route Matchesも参照してください... Rails Engine

于 2015-07-11T13:46:28.170 に答える