Rails 5.2通过Axios请求返回406

时间:2019-03-13 08:55:11

标签: ruby-on-rails ruby vue.js cross-domain axios

我在Rails 5.2中有一个Rails API,在Vuejs中有一个前端,使用Axios来请求API。 当我在路线上要求邮递员

  

[GET] http://localhost:3000/foo

我得到了预期的JSON响应。

但是当我向Axios请求时:

import axios from 'axios'

export default {
  getAll () {
    return axios.get('http://localhost:3000/foo', {
      headers: { 'Content-Type': 'application/json' }
    })
  }
}

我从服务器收到此响应:

  

CleanwalksController#index缺少此请求格式和变体的模板。 request.formats:[“ text / html”] request.variant:[]

我有以下config / cors.rb:

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'
    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

当我尝试直接访问 http://localhost:3000/foo 时,我遇到了同样的问题。

这是我的控制器:

class FooController < ApplicationController

  def index
    @foo = foo.all
  end

end

2 个答案:

答案 0 :(得分:1)

我认为您的问题出在您的观点上,您是否有一个名为index.html.erb的文件。否则,您可以定义多种响应格式,如下所示:

class FooController < ApplicationController

def index
  @foo = foo.all
  respond_to do |format|
    format.html { render :index }
    format.json { render json: @foo, status: 200 }
  end
end

end

答案 1 :(得分:0)

我遇到了完全相同的问题。在我的规格和邮递员中,一切工作都很好,但是由于某种原因,我得到了带有vue / axios的406。

拉长头发后,我在路线文件中发现了一个错字:

namespace :v1, default: { format: :json } do

它应该是默认值(复数)

namespace :v1, defaults: { format: :json } do