无法找到控制器路径的设计映射

时间:2016-02-25 20:30:56

标签: ruby-on-rails ruby model-view-controller devise

我知道同样的问题有很多问题但是没有一个解决方案似乎适用于我的情况。

我已经定义了自己的会话,注册和用户控制器,因为我使用的是带有令牌身份验证的API,但我似乎无法使我的路由/范围有效。

尝试在我的会话控制器(继承自DeviseController)上运行Spec测试时收到以下错误消息

 Failure/Error: post :create,  credentials

 AbstractController::ActionNotFound:
   Could not find devise mapping for path "/api/v1/sessions/create?user_login%5Bemail%5D=rosina%40russel.name&user_login%5Bpassword%5D=12345678".
   This may happen for two reasons:

   1) You forgot to wrap your route inside the scope block. For example:

     devise_scope :user do
       get "/some/route" => "some_devise_controller"
     end

   2) You are testing a Devise controller bypassing the router.
      If so, you can explicitly tell Devise which mapping to use:

      @request.env["devise.mapping"] = Devise.mappings[:user]

我实际上已根据我读过的其他答案完成了这两件事,但我不认为它对我的具体情况做得正确。

这是我正在尝试运行的规范测试

describe "POST #create" do

before(:each) do
 @user = FactoryGirl.create :user
 @user.skip_confirmation!
 @request.env['devise.mapping'] = Devise.mappings[:user]
end

context "when the credentials are correct" do

  before(:each) do
    credentials = { user_login: { :email => @user.email, :password => "12345678"} }
    post :create,  credentials
  end

  it "returns the user record corresponding to the given credentials" do
    @user.reload
    user_response = JSON.parse(response.body, symbolize_names: true)
    expect(user_response[:auth_token]).to eql @user.auth_token
  end

  it { should respond_with :created }
end
end

正如你所看到的,我正在说明我没说明的内容。

以下是我在其命名空间中定义API之前的routes.rb的代码段:

namespace :api, defaults: { format: :json } do
  namespace :v1 do
    devise_for :users, skip: [:sessions, :registrations]      

    devise_scope :user do
      post 'sessions', to: 'sessions#create'
      delete 'sessions', to: 'sessions#destroy'
    end

如果有人从中看到任何东西,请告诉我,我很想测试我的控制器...

是的,我的sessions_controller位于app/controllers/api/v1/sessions_controller.rb,并且已正确定义为class API::V1::SessionsController < DeviseController

我注意到devise_for应该是SET Devise.mapping,但似乎根本没有发生!

2 个答案:

答案 0 :(得分:1)

我应该马上做到这一点。我将Devise.mappings.inspect发送到记录器,它读取映射存储在:api_v1_user中,因此映射哈希中的键对应于您编写devise_for的命名空间...希望这将有助于其他人

答案 1 :(得分:0)

根据您的路线,API为json格式。因此,您需要在发送post方法时指定。这就是为什么我认为rspec抱怨该路由不存在,因为它不知道使用json。尝试更改此

post :create, credentials

到这个

post :create, credentials, format: :json