【问题标题】:No route matches - Rails 4.0 error没有路线匹配 - Rails 4.0 错误
【发布时间】:2013-12-10 05:16:32
【问题描述】:

所以我正在编写一些返回和处理 json 的 API 控制器。一个特别是会话控制器。我这样设置路线:

注意:(我只是向您展示了销毁方法,因为这是我唯一遇到的问题......)

  namespace :api do
    namespace :v1 do
      resource :users
      resources :sessions
    end
  end

然后我有如下路线:

   api_v1_sessions GET    /api/v1/sessions(.:format)          api/v1/sessions#index
                    POST   /api/v1/sessions(.:format)          api/v1/sessions#create
 new_api_v1_session GET    /api/v1/sessions/new(.:format)      api/v1/sessions#new
edit_api_v1_session GET    /api/v1/sessions/:id/edit(.:format) api/v1/sessions#edit
     api_v1_session GET    /api/v1/sessions/:id(.:format)      api/v1/sessions#show
                    PATCH  /api/v1/sessions/:id(.:format)      api/v1/sessions#update
                    PUT    /api/v1/sessions/:id(.:format)      api/v1/sessions#update
                    DELETE /api/v1/sessions/:id(.:format)      api/v1/sessions#destroy

最后我为api/v1/sessions#destroy销毁了如下所示的代码:

    def destroy
      @user = User.find_by auth_token: param[:auth_token]
      return invalid_user_crendentials unless @user

      cookies.delete(@user.auth_token)
      render json: { user_id: @user.id }, status: 200
    end

然后我为此特定操作编写了以下规范测试:

 context "Destroy a session" do
    it "should NOT destroy a session" do
        post :destroy
        response.response_code.should == 401
    end

    it "should NOT destroy a session with invalid token" do
        post :destroy, auth_token: '34534534'
        response.response_code.should == 401
    end

    it "should destroy a session based on valid data" do
        post :destory, auth_token: @user.auth_token
        json = JSON.parse response.body
        json.to_json.should have_json_path('user_id')
        response.response_code.should == 200
    end
  end

但是当我运行它时,我得到:

No route matches {:auth_token=>"34534534", :controller=>"api/v1/sessions", :action=>"destroy"}
 No route matches {:auth_token=>"QfEg4oa0UdhJF4K1VIBADg", :controller=>"api/v1/sessions", :action=>"destory"}
No route matches {:controller=>"api/v1/sessions", :action=>"destroy"}

没有路由怎么匹配?有吗?

【问题讨论】:

  • 您是否在使用 Webmock 或 VCR 之类的东西在测试中排除请求?
  • FactoryGirl 是我用来创建用户的

标签: ruby-on-rails rspec routes


【解决方案1】:

post 更改为delete

context "Destroy a session" do
  it "should NOT destroy a session" do
      delete :destroy
      response.response_code.should == 401
  end

  it "should NOT destroy a session with invalid token" do
      delete :destroy, auth_token: '34534534'
      response.response_code.should == 401
  end

  it "should destroy a session based on valid data" do
      delete :destory, auth_token: @user.auth_token
      json = JSON.parse response.body
      json.to_json.should have_json_path('user_id')
      response.response_code.should == 200
  end
end

您可以在 rake routes 输出中看到您的销毁操作仅接受 delete 请求:

DELETE /api/v1/sessions/:id(.:format) api/v1/sessions#destroy

它也在寻找:id 参数。我认为您想在您的控制器中将 param[:auth_token] 更改为 param[:id] 并在您的规范中将 auth_token 更改为 id

【讨论】:

  • post 更改为 delete,我得到了 - 与我在上面发布的完全相同的错误。
  • 我没有传入的 ID,我正在通过 cookie 创建会话并将用户生成的 auth_token 存储在 cookie 中...
  • 我明白,但是您的网址将/api/vi/sessions/ 之后的任何内容放入param[:id]。如果命名对您很重要,则必须为路线指定。
  • 我的想法来自github.com/heartsentwined/ember-auth-rails-demo/blob/master/app/…,因此为什么我要传递身份验证令牌....而且他们的路线似乎并不异常......那么他们怎么能通过auth_token?我不能在哪里(路线:github.com/heartsentwined/ember-auth-rails-demo/blob/master/…)我错过了什么?
  • 他们的路线和你的完全不同——你有一个会话资源,他们没有。
【解决方案2】:

您的路线都希望传入id 参数。

DELETE /api/v1/sessions/:id

您的测试正在通过auth_token。更改测试以通过 id

注意:您的测试确实应该是delete :destroy 而不是post,而且您的第三个测试在:destroy 中也有错字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    相关资源
    最近更新 更多