正在开发中但在生产中显示的JSON数据未正确显示

时间:2018-05-22 11:19:41

标签: ruby-on-rails ruby postgresql heroku sqlite

这是我的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:JSON数据第1行第1列的意外字符

我知道代码是“找不到”

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'] %>

任何有用的帮助。

由于

2 个答案:

答案 0 :(得分:6)

您的代码的if分支很好,并且由于dev包含记录,所以它的呈现没有任何故障。

prod,OTOH中,没有记录,并且尝试渲染else分支,这是不正确的。它失败了,给你错误。

请在那里提供哈希:

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

答案 1 :(得分:1)

查看SQL中的LIKE关键字,如果对SQLite使用development数据库,PostgreSQL使用production数据库,那么可能它已经发生了,like正在开发环境和生产环境ilike like不起作用,OTOH,ilikeSQLite中不起作用。

如果是,那么解决方案是:

解决方案1 ​​您可以将开发数据库更改为PostgreSQL,如果您担心更改数据库,请按照以下步骤进行操作

解决方案2 您可以使用lower(attr)之类的

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

您可以看到SO Answer

希望会有所帮助。