为什么 Rails 在生产中无法检测到 AJAX 请求?

sim*_*imo 7 ruby-on-rails ruby-on-rails-5

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

我还尝试向所有人添加默认的 json 响应classrooms_controller

resources :schools, :defaults => { :format => 'json' }
Run Code Online (Sandbox Code Playgroud)

我试图添加.json到路线,但也没有奏效

我该如何调试?因为它在本地工作,但不在生产服务器上?我正在与乘客一起使用 nginx。

可能是什么问题?

编辑

我也试过:

ActiveModel::Serializer.config.adapter = ActiveModel::Serializer::Adapter::JsonApi
Run Code Online (Sandbox Code Playgroud)

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"
Run Code Online (Sandbox Code Playgroud)

我将它设置为application/json, text/plain, */*,仍然,rails search for a template!!

编辑3

我试图将默认请求设置为 json 为:

request.format = :json
Run Code Online (Sandbox Code Playgroud)

我尝试使用 format.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

Run Code Online (Sandbox Code Playgroud)

我仍然有同样的错误,搜索模板..

编辑4

这是我的请求标头:

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
Run Code Online (Sandbox Code Playgroud)

和路线:

namespace :api, defaults: {format: :json} do
    get 'classrooms' => 'schools#classrooms'
  end
Run Code Online (Sandbox Code Playgroud)

sim*_*imo 3

在经历了之前几个小时的沮丧之后,我决定自行调试我试图创建 json 对象的代码。我传递了一个空的 json 对象,然后,我得到了带有空 json 对象的状态 200 响应!所以,这个错误ActionView::MissingTemplate完全是误导性的!!,让我看不到真正的错误。我在rails控制台中运行代码user.daip.class_rooms.as_json(:include => [:users]),出现以下错误:

Cannot have a has_many :through association 'ClassRoom#users' which goes through 'ClassRoom#class_rooms_users' before the through association is defined
Run Code Online (Sandbox Code Playgroud)

查了一下class_room型号,哦!我只需要翻转这些线:

  has_many :users, through: :class_rooms_users
  has_many :class_rooms_users
Run Code Online (Sandbox Code Playgroud)

到:

  has_many :class_rooms_users 
  has_many :users, through: :class_rooms_users
Run Code Online (Sandbox Code Playgroud)

这真是一个悲伤的故事,座右铭是,当一切似乎都很好时,永远不要相信错误消息,悲伤的开发人员。