Приложение rails отправляет слишком много ненужных данных в json - PullRequest
0 голосов
/ 31 января 2019

Желаемый вывод: только данные из событий, например:

[{"id":600,"title":600,"start":"2018-10-17T15:24:06.000Z","end":"2018-10-17T17:11:06.000Z","color":"green"}
[{"id":601,"title":601,"start":"2019-10-17T15:24:06.000Z","end":"2018-10-17T17:11:06.000Z","color":"green"}

Токовый выход по какой-то причине также дает информацию из application.html.erb и application.js и других файлов: enter image description here

events / _event.json.jbuilder:

json.id event.id
json.title event.id
json.start event.starts_at
json.end event.ends_at
json.color event.status_color unless event.status_color.blank?
json.url event_url(event, format: :json)

index.json.jbuilder:

json.array! @events, partial: 'events/event', as: :event

Контроллер:

class EventsController < ApplicationController
  def index
    @events = Event.all
    #@q = Event.ransack(params[:q])
    #@events = @q.result.includes(:location, :client, :jobs).paginate(:page => params[:page], :per_page => 15).order("created_at DESC")
  end end

Консоль:

Started GET "/events.json" for 143.27.126.62 at 2019-01-31 10:49:24 +0000
Cannot render console from 143.27.126.62! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by EventsController#index as JSON
  User Load (0.8ms)  SELECT  "users".* FROM "users" WHERE (users.tenant_id IS NULL) AND "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ /usr/local/rvm/gems/ruby-2.5.3/bundler/gems/milia-4c36b46f3f42/lib/milia/control.rb:102
  Tenant Load (0.7ms)  SELECT "tenants".* FROM "tenants" INNER JOIN "tenants_users" ON "tenants"."id" = "tenants_users"."tenant_id" WHERE (tenants.tenant_id IS NULL) AND "tenants_users"."user_id" = $1  [["user_id", 1]]
  ↳ /usr/local/rvm/gems/ruby-2.5.3/bundler/gems/milia-4c36b46f3f42/lib/milia/control.rb:69
MILIA >>>>> [change tenant] new: 1      old: 1
MILIA >>>>> [auth_tenant callback]
  Tenant Load (0.6ms)  SELECT  "tenants".* FROM "tenants" WHERE (tenants.tenant_id IS NULL) AND "tenants"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ /usr/local/rvm/gems/ruby-2.5.3/bundler/gems/milia-4c36b46f3f42/lib/milia/base.rb:126
  CACHE Tenant Load (0.0ms)  SELECT  "tenants".* FROM "tenants" WHERE (tenants.tenant_id IS NULL) AND "tenants"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ /usr/local/rvm/gems/ruby-2.5.3/bundler/gems/milia-4c36b46f3f42/lib/milia/base.rb:126
  CACHE Tenant Load (0.0ms)  SELECT  "tenants".* FROM "tenants" WHERE (tenants.tenant_id IS NULL) AND "tenants"."id" = $1 LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ /usr/local/rvm/gems/ruby-2.5.3/bundler/gems/milia-4c36b46f3f42/lib/milia/base.rb:126
  Rendering events/index.json.jbuilder within layouts/application
  Event Load (80.7ms)  SELECT "events".* FROM "events" WHERE (events.tenant_id = 1)
  ↳ app/views/events/index.json.jbuilder:1
  Rendered events/_event.json.jbuilder (1.1ms)
  Rendered events/_event.json.jbuilder (0.3ms)
  Rendered events/_event.json.jbuilder (0.2ms)
  Rendered events/_event.json.jbuilder (0.2ms)
  Rendered events/_event.json.jbuilder (0.3ms)

Может быть, это связано с Rendering events/index.json.jbuilder within layouts/application?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Попробуйте добавить respont_to :json в последнюю строку метода действия.

class EventsController < ApplicationController
  def index
    @events = Event.all
    resond_to :json # add this line
  end
end
0 голосов
/ 31 января 2019

Поскольку мне нужно написать некоторый код, я публикую это сейчас в качестве ответа:

Вы уверены, что он делает /events.json?или вместо этого делает /events?(глядя на ваш скриншот, я думаю, что вы просто набрали /events.json там в адресной строке Chrome, потому что там должно быть имя хоста по умолчанию (из AFAIK).

Как rails определить, чтоформат ответа для вывода - этот документ :

Пример:

GET /posts/5.xml   | request.format => Mime::XML
GET /posts/5.xhtml | request.format => Mime::HTML
GET /posts/5       | request.format => Mime::HTML or MIME::JS, or request.accepts.first`

Следовательно,

  • GET /events.xml будет по умолчанию отображать app/views/events.xml.TEMPLATE_ENGINE

  • GET /events.json будет по умолчанию отображать app/views/events.json.TEMPLATE_ENGINE

  • GET /events будет по умолчанию выводить из первого значения в заголовке «Accept», т. Е. Если я наберу этот URL в адресной строке Chrome, глядя на вкладку Chrome Network, Chrome, похоже, сгенерирует заголовок «Accept» следующим образом:

    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
    

    ... из которых первое значение равно text/html, и именно поэтому Rails по умолчанию будет отображать app/views/posts.html.TEMPLATE_ENGINE.

    ^ в настоящее время я думаю, почемувместо этого вы видите HTML, потому что, вероятно, ваш запрос GET /events вместо правильного GET /events.json.сделайте GET /events, но вам нужно изменить заголовок "Accept", чтобы он был равен "application/json"

Отладка:

Чтобы проверить мою теорию выше, вы можете открытьChrome "Network Tab" (нажмите ЗДЕСЬ , если вы не знаете, как его открыть).А затем выполните / отправьте запрос как обычно на конечную точку Rails (не знаю, возможно, вы нажимали кнопку, чтобы отправить запрос?).После этого вкладка «Сеть» будет заполнена.Вы могли бы видеть что-то вроде ниже: Network Request Example Screenshot

Как вы могли видеть, URL-адрес - posts.json, что и должно быть.Если вместо этого вы видите events, а не events.json, то это ваша проблема;вам нужно убедиться, что он выполняет events.json вместо этого, или вы все равно можете сделать events, но обновите заголовок "Accept" в запросе (как вы видите на скриншоте, значение должно быть "Accept: application/json"

PS все, что я сказал выше, предполагает, что вы не выполняете рендеринг "вручную" в действии контроллера, и что вы не вызываете render вручную (что затем сделает значения по умолчанию Railsи Rails будет отображаться неявно так, как я описал в моем ответе выше)

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