Это мой 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'] %>
Любая помощь приложена.
Спасибо
@ fool-dev Я обновил вопрос.





Ветвь if вашего кода в порядке, и поскольку dev содержит записи, он отображается без каких-либо сбоев.
В prod, OTOH нет записей и пытается отрендерить ветвь else, что не совсем корректно. И это не удается, что приводит к ошибке.
Вместо этого укажите хеш:
else
render json: {error: "Not Found"}, status: :ok
end
"OTOH" = "Оbfuscated Тext Оnly ЧАСinders" (я верю) :)
@engineersmnky Оn Тhe Оther ЧАСand, но мне больше нравится ваша интерпретация.
@mudasobwa спасибо за ответ, мой вопрос в том, что поисковый запрос не работает, он будет блокироваться
@jesica у вас есть данные в продакшене? Похоже, вы этого не сделали, поэтому он собирается заблокировать else.
Да, у меня много данных, если я использую как Job.all, тогда он вернет данные
Затем проверьте params[:q] - похоже, осциллограф возвращает пустой набор.
@mudasobwa +1 для вас, но решение из ответа fool-dev, ваш ответ, мне очень помогло, спасибо
Посмотрите ключевое слово 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
Вы можете увидеть ТАК ответ для этого.
Надеюсь поможет.
Не могли бы вы предоставить
database.ymlдля проверки адаптера базы данных, я думаю, это вызывает адаптер базы данных,likeне работает вPostgreSQLOTOH,ilikeне работает вSQLite, если вы используетеSQLiteдля разработки иPostgreSQLдля производства,