Данные JSON отображаются правильно в разработке, но в производстве не отображаются должным образом

Это мой routes.rb

namespace :api do
    get 'suggestions/jobs', to: "suggestions#jobs"
end

Мой контроллер

class Api::SuggestionsController < ApplicationController
    def jobs
        @jobs = Job.job_title_search(params[:q])   #.select(:title, :label).distinct
        if @jobs.present?
            render json: @jobs, status: :ok
        else
            render json: "Not Found", status: :ok
        end
    end
end

и модель

def self.job_title_search(q)
    where('title LIKE ?', "%#{q}%").select(:title, :label).distinct
end

в среде разработки, такой как localhost:3000/api/suggestions/jobs?q=dev, образец данных

[
    {"id":null,"title":"React Native Developer","label":"Top label job"},
    {"id":null,"title":"Android Developer","label":"Top label job"},
    {"id":null,"title":"Business Development Representative","label":"Mid label job"},
    {"id":null,"title":"Node.js Developer","label":"Top label job"}
]

это означает, что он работает, но пока я вставлял в Heroku, как и example.herokuapp.com/api/suggestions/jobs?q=dev, он показывает

SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data

Я знаю, что есть "Не найдено", как будто код

render json: "Not Found", status: :ok

У меня вопрос: почему тот же код не работает на Heroku? и что я могу для этого сделать?

файл database.yml

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
#
default: &default
  adapter: sqlite3
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  timeout: 5000

development:
  <<: *default
  database: db/development.sqlite3

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: db/test.sqlite3

production:
  <<: *default
  database: my_project_production
  username: my_project
  password: <%= ENV['MY_PROJECT_DATABASE_PASSWORD'] %>

Любая помощь приложена.

Спасибо

Не могли бы вы предоставить database.yml для проверки адаптера базы данных, я думаю, это вызывает адаптер базы данных, like не работает в PostgreSQL OTOH, ilike не работает в SQLite, если вы используете SQLite для разработки и PostgreSQL для производства,

fool-dev 23.05.2018 07:27

@ fool-dev Я обновил вопрос.

jesica 23.05.2018 07:38
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
119
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ветвь if вашего кода в порядке, и поскольку dev содержит записи, он отображается без каких-либо сбоев.

В prod, OTOH нет записей и пытается отрендерить ветвь else, что не совсем корректно. И это не удается, что приводит к ошибке.

Вместо этого укажите хеш:

else
  render json: {error: "Not Found"}, status: :ok
end

"OTOH" = "Оbfuscated Тext Оnly ЧАСinders" (я верю) :)

engineersmnky 22.05.2018 17:26

@engineersmnky Оn Тhe Оther ЧАСand, но мне больше нравится ваша интерпретация.

Aleksei Matiushkin 22.05.2018 17:48

@mudasobwa спасибо за ответ, мой вопрос в том, что поисковый запрос не работает, он будет блокироваться

jesica 22.05.2018 17:57

@jesica у вас есть данные в продакшене? Похоже, вы этого не сделали, поэтому он собирается заблокировать else.

Aleksei Matiushkin 22.05.2018 17:59

Да, у меня много данных, если я использую как Job.all, тогда он вернет данные

jesica 22.05.2018 18:06

Затем проверьте params[:q] - похоже, осциллограф возвращает пустой набор.

Aleksei Matiushkin 22.05.2018 18:08

@mudasobwa +1 для вас, но решение из ответа fool-dev, ваш ответ, мне очень помогло, спасибо

jesica 23.05.2018 07:57
Ответ принят как подходящий

Посмотрите ключевое слово LIKE в SQL, если вы используете базу данных SQLite для development и базу данных PostgreSQL для production, тогда, возможно, это произошло, like работает в среде разработки, а производственная среда будет ilike, like не работает, OTOH, ilike не работает в SQLite.

Если да, то решение:

Решение 1 Вы можете изменить базу данных разработки на PostgreSQL, если вы беспокоитесь об изменении базы данных, выполните следующие действия.

Решение 2 Вы можете использовать lower(attr) как

def self.job_title_search(q)
    where('lower(title) LIKE lower(?)', "%#{q}%").select(:title, :label).distinct
end

Вы можете увидеть ТАК ответ для этого.

Надеюсь поможет.

Другие вопросы по теме