没有路由匹配...Rails引擎

16

我一直在遇到这个错误:

No route matches {:action=>"create", :controller=>"xaaron/api_keys"}

这个错误是在测试中抛出的:

it "should not create an api key for those not logged in" do
  post :create
  expect(response).to redirect_to xaaron.login_path
end

当我进入spec/dummy并运行rake routes命令时,我看到:

       api_keys GET    /api_keys(.:format)                 xaaron/api_keys#index
                POST   /api_keys(.:format)                 xaaron/api_keys#create
    new_api_key GET    /api_keys/new(.:format)             xaaron/api_keys#new
   edit_api_key GET    /api_keys/:id/edit(.:format)        xaaron/api_keys#edit
        api_key GET    /api_keys/:id(.:format)             xaaron/api_keys#show
                PATCH  /api_keys/:id(.:format)             xaaron/api_keys#update
                PUT    /api_keys/:id(.:format)             xaaron/api_keys#update
                DELETE /api_keys/:id(.:format)             xaaron/api_keys#destroy

这表明这条路线确实存在。我这个引擎的路由文件看起来像是:

Xaaron::Engine.routes.draw do
      get 'login' => 'sessions#new', :as => 'login'
      get 'logout' => 'sessions#destroy', :as => 'logout'
      get 'signup' => 'users#new', :as => 'signup'
      get 'permission_denied' => 'error#denied', :as => 'permission_denied'
      get 'record_not_found' => 'error#error', :as => 'record_not_found'
      get 'password_reset' => 'password_resets#edit', :as => 'rest_user_password'

      resource :error, controller: 'error'

      resources :users
      resources :api_keys
      resources :sessions
      resources :roles
      resources :password_resets
end

我错过了什么?

更新

如果你们好奇我是如何获得这些路由的,那是因为这个虚拟应用程序的路由文件被设置为(默认情况下)如下:

Rails.application.routes.draw do

  mount Xaaron::Engine => "/xaaron"
end

更新 II

我一直在阅读这个引擎路由的api文档,我相信我做的方式是正确的,但是控制器被定义为:

module Xaaron
  class ApiKeysController < ActionController::Base
    before_action :authenticate_user!

    def index
      @api_key = Xaaron::ApiKey.where(:user_id => current_user.id)
    end

    def create
      @api_key = Xaaron::ApiKey.new(:user_id => current_user.id, :api_key => SecureRandom.hex(16))
      create_api_key(@api_key)
    end

    def destroy
      Xaaron::ApiKey.find(params[:id]).destroy
      flash[:notice] = 'Api Key has been deleted.'
      redirect_to xarron.api_keys_path
    end
  end
end

谢谢更新。我将对mount做一些研究。api_keys控制器是如何定义的?它在xaaron模块中吗?请分享一些具体细节/代码。 - Kirti Thorat
@KirtiThorat,已经进行了适当的更新。正如我所说,我一直在阅读:http://api.rubyonrails.org/classes/Rails/Engine.html,以更好地理解引擎中路由的工作原理。我相信我已经做得正确 - 尽管我可能错过了一些简单的东西。 - user3379926
1个回答

25

你需要告诉你的规范(spec),你正在使用引擎路由(engine routes):

describe ApiKeysController do
  routes { Xaaron::Engine.routes }

  it "should not create an api key for those not logged in" do
    post :create
    expect(response).to redirect_to xaaron.login_path
  end
end

真的吗?有关于那个的文档吗? - user3379926
2
https://www.relishapp.com/rspec/rspec-rails/v/2-14/docs/routing-specs/engine-routes - Logan Serman
+1 这很简单!!我之前不知道这个。:p - Kirti Thorat
这也适用于控制器规范(除了@LoganSerman链接到的文档中的路由规范之外):https://relishapp.com/rspec/rspec-rails/v/2-14/docs/controller-specs/engine-routes-for-controllers - Isaac Betesh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接