我知道有相同的問題有很多問題,但沒有一個解決方案似乎適用於我的情況。無法找到控制器路徑的設計映射
我已經定義了我自己的會話,註冊和用戶控制器,因爲我使用的是帶有令牌認證的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但似乎沒有在所有發生的事情!
它會幫助如果你包含實際的規格,你的運行不僅僅是在塊 – MilesStanfield
@MilesStanfield之前,它是無關緊要的,它甚至不會運行它通過發佈請求。測試甚至沒有機會運行 – Riptyde4
它**可能無關緊要。但你要求我們幫助,所以讓我們決定 – MilesStanfield