Rails 5.2 возвращает 406 с запросом Axios

#ruby-on-rails #ruby #vue.js #cross-domain #axios

#ruby-on-rails #ruby #vue.js #междоменный #axios

Вопрос:

У меня есть rails API в Rails 5.2 и интерфейс в Vuejs, использующий Axios для запроса API. Когда я запрашиваю у postman на маршруте

[ПОЛУЧИТЬ]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 отсутствует шаблон для этого формата и варианта запроса. запрос.форматы: [«текст / html»] запрос.вариант: []

У меня есть следующая конфигурация / 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
  

Комментарии:

1. Вы пробовали вызывать localhost:3000/foo.json , чтобы заставить запрос использовать вариант JSON (вместо того, чтобы полагаться на заголовок)?

Ответ №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
  

Ответ №2:

У меня была точно такая же проблема. В моих спецификациях и в postman все работало идеально, но по какой-то причине я получал 406 с vue / axios.

После долгих усилий я обнаружил опечатку в моем файле routes:

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

Это должны были быть значения по умолчанию (множественное число)

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