2016-02-25 204 views
1

我知道有相同的問題有很多問題,但沒有一個解決方案似乎適用於我的情況。無法找到控制器路徑的設計映射

我已經定義了我自己的會話,註冊和用戶控制器,因爲我使用的是帶有令牌認證的API,但我似乎無法獲得我的路由/作用域範圍工作。

我在嘗試運行我的會話控制器上的規格測試(從DeviseController繼承)

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 

正如你所看到的,我指定什麼它說,我還沒有規定。

這裏是我的routes.rb我的API的定義,它的命名空間前的片段:

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但似乎沒有在所有發生的事情!

+0

它會幫助如果你包含實際的規格,你的運行不僅僅是在塊 – MilesStanfield

+0

@MilesStanfield之前,它是無關緊要的,它甚至不會運行它通過發佈請求。測試甚至沒有機會運行 – Riptyde4

+0

它**可能無關緊要。但你要求我們幫助,所以讓我們決定 – MilesStanfield

回答

0

根據您的路線,API格式爲json格式。所以你需要在發送post方法時指定。這就是爲什麼我認爲rspec抱怨這條路線不存在,因爲它不知道使用json。嘗試改變這種

post :create, credentials 

這個

post :create, credentials, format: :json 
+0

哎呀,忘記了,但我仍然得到相同的錯誤..有一些事情搞砸了我如何定義設計路線到控制器 – Riptyde4

0

我應該這樣做了的時候了。我將Devise.mappings.inspect發送到記錄器,它讀取映射存儲在:api_v1_user中,因此映射哈希中的鍵對應於您寫入devise_for的命名空間......希望這可以幫助其他人