Почему Rails не может обнаружить AJAX запрос в работе? - PullRequest
7 голосов
/ 29 января 2020

Я использую rails 5.2.4.1, и мне интересно, почему я получаю эту ошибку, когда пытаюсь получить доступ к конечной точке API:

ActionView::MissingTemplate (отсутствует шаблон API / школ / классы , приложение / классы с {:locale=>[:en], :formats=>[:json], :variants=>[], :handlers=>[:raw, :erb, :html, :builder, :ruby, :haml]}.

вот мое действие:

def classrooms
    render json: {classrooms: user.daip.class_rooms.as_json(:include => [:users]), max_classrooms: user.daip.classrooms} , content_type: 'application/json'
  end

Я попытался также добавить значение по умолчанию json ответ на все classrooms_controller как:

resources :schools, :defaults => { :format => 'json' }

Я пытался добавить .json к маршруту, но также не получилось

как я могу отладить это? Как это работает локально, но не на производственном сервере? Я использую nginx с пассажиром.

В чем может быть проблема?

РЕДАКТИРОВАТЬ

I также пробовал:

ActiveModel::Serializer.config.adapter = ActiveModel::Serializer::Adapter::JsonApi

EDIT2 Я обнаружил, что заголовок HTTP_ACCEPT передается как:

"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"

Я установил его на application/json, text/plain, */*, все еще, рельсы поиск шаблона !!

EDIT3

Я попытался установить для запроса по умолчанию значение json как:

request.format = :json

и попытался используйте формат. json как:

def classrooms
    request.format = :json
    format.json {
    render plain: {classrooms: user.daip.class_rooms.as_json(:include => [:users]), max_classrooms: user.daip.classrooms}.to_json , content_type: 'application/json'
    }
  end

И у меня все еще та же ошибка, поиск шаблона ..

EDIT4

Вот мои заголовки запроса:

Host: myapp.com
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Content-Type: application/json
Referer: https://myapp.com/en/api/school-admin
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
TE: Trailers
Origin: https://myapp.com
Content-Length: 0

и маршрут:

namespace :api, defaults: {format: :json} do
    get 'classrooms' => 'schools#classrooms'
  end

1 Ответ

3 голосов
/ 01 февраля 2020

После долгих часов разочарования я решил отладить сам код, который пытался создать объект json. Я передал пустой объект json, а затем получил ответ 200 статуса с пустым объектом json! Таким образом, ошибка ActionView::MissingTemplate полностью вводила в заблуждение !!, и я ослепла от настоящей ошибки. Я запустил код user.daip.class_rooms.as_json(:include => [:users]) в консоли rails и получил эту ошибку:

Cannot have a has_many :through association 'ClassRoom#users' which goes through 'ClassRoom#class_rooms_users' before the through association is defined

Проверено class_room модель, и о! Мне просто нужно было перевернуть эти строки:

  has_many :users, through: :class_rooms_users
  has_many :class_rooms_users

до:

  has_many :class_rooms_users 
  has_many :users, through: :class_rooms_users

Это была действительно печальная история, девиз такой: никогда не доверяйте сообщениям об ошибках, когда все кажется нормальным, грустные разработчики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...