Ruby on rails Rails序列化程序未筛选数据

Ruby on rails Rails序列化程序未筛选数据,ruby-on-rails,json,active-model-serializers,Ruby On Rails,Json,Active Model Serializers,我试图在Rails API应用程序中的API返回的JSON对象上使用Rail的序列化程序。我需要进行身份验证,接收API,过滤数据,并重新广播过滤后的数据。不需要查看 为了过滤数据,我正在尝试实现序列化程序——很明显,我没有正确设置它。我可以看到它正在工作和就位,因为它正在返回的数据前面添加初始对象(请参见下面的数据:序列化对象以kobo_data开头)。但它会返回所有的数据字段,而不仅仅是我试图调用的字段。在本例中,我试图只返回字段prikey,但它返回的是所有数据字段 我尝试在类似于(,)的

我试图在Rails API应用程序中的API返回的JSON对象上使用Rail的序列化程序。我需要进行身份验证,接收API,过滤数据,并重新广播过滤后的数据。不需要查看

为了过滤数据,我正在尝试实现序列化程序——很明显,我没有正确设置它。我可以看到它正在工作和就位,因为它正在返回的数据前面添加初始对象(请参见下面的数据:序列化对象以
kobo_data
开头)。但它会返回所有的数据字段,而不仅仅是我试图调用的字段。在本例中,我试图只返回字段
prikey
,但它返回的是所有数据字段

我尝试在类似于(,)的线程中解决问题,尽管由于我没有.html视图,我想知道这是否与上一个链接中提到的问题有关。但是我做的另一个教程()在没有视图的Rails API应用程序中使用了序列化,所以我猜不是

有没有关于我做错了什么以及如何修复的建议

型号:

class KoboApi < ActiveRecord::Base    
    require 'rest_client'
    USERNAME = ENV['KOBO_API_USER']
    PASSWORD = ENV['KOBO_API_PWD']
    SURVEY = ENV['KOBO_API_SURVEY']
    # API_BASE_URL = "https://kc.kobotoolbox.org/api/v1/"
    API_BASE_URL = "https://sg.smap.com.au/api/v1"
    def self.get_api_info
        uri = "#{API_BASE_URL}/data/#{SURVEY}?format=json"
        rest_resource = RestClient::Resource.new(uri, USERNAME, PASSWORD)
        response = rest_resource.get
        JSON.parse response
    end
end
返回的数据

{"kobo_data":[{"prikey":"1","Upload Time":"2016-06-17 11:11:38.802+00","Version":"1","Complete":"t","Survey Notes":"","Location Trigger":"","deviceid":"webworm"....[data truncated]

我刚刚与一位指导我解决问题的人进行了交谈,并不是所有问题都与我在上面发布的代码有关。我在这里发布了一些详细信息。我确信有其他方法可以解决此问题,但这就是我们解决问题的方法。希望对您有所帮助

主要问题:没有
每个序列化程序
与上面发布的语言特别相关:我没有在模型中的
render
语句中包含对
每个序列化程序的引用。此线程中也引用了此问题:

控制器

class KoboDataController < ApplicationController
    def index
        @kobo_info = KoboApi.get_api_info
        render json: @kobo_info
    end
end
class ApplicationController < ActionController::API
    include ActionController::Serialization
end
class KoboDataController < ApplicationController
  def index
    @kobo_info = KoboApi.get_api_info
    @kobo_info.each do |kobo_info|
      begin
        #this pulls in new records that have been added to the api and adds them to the database.  it doesn't pull in records from the api that are already in the db
        KoboApi.find_or_create_by(lemurs_quantity: kobo_info['lemurs_quantity'], month_and_year:  Date.parse(kobo_info['month_and_year']))
          # some of my records don't have valid date values, so `rescue` is added to keep rails from returning a `notfound` page.
          # quick tutorial here:  http://www.rubytutorial.io/rails-rescue_from/
      rescue
        puts "rescued"
      end
    end
    # I needed to update my render logic.
    # see addition of `each_serializer` here.
    # @kobo_info has also changed to KoboApi.all as well.
    render(
      json: KoboApi.all,
      each_serializer: KoboApiSerializer
    )
  end
end
第二个问题:数据库表名不正确 然而,我对我创建的两个单词的表名有一个问题。我用camelCase名称结构创建了我的表,rails希望使用分隔的单词(即:带下划线)

您可以在这里看到表名为
koboApis

原始迁移

class KoboApis < ActiveRecord::Migration
  def change
    create_table :koboApis do |t|
      t.integer :lemurs_quantity
      t.date  :month_and_year
      t.text :_geolocation
      t.text :lemur_category
    end
  end
end
因此,Rails期望的表甚至不存在

我们通过在终端运行第二次迁移来修复此问题:
rails g migration RenameOldTableToNewTable
。然后我将此逻辑添加到新的迁移文件中:
rename\u table:koboApis,:kobo\u api
。整个迁移文件如下:

更新迁移文件

source 'https://rubygems.org'

gem 'active_model_serializers', '~> 0.8.3'
gem 'rest-client'
gem 'pg'
gem 'rails', '4.2.5.1'
gem 'rails-api'
gem 'spring', :group => :development

# gem for environment variables
gem 'dotenv-rails', :groups => [:development, :test]
gem 'figaro'
class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
     rename_table :koboApis, :kobo_apis
  end
end
类重命名eoldtabletonewtable

我运行了
rake db:drop db:create db:migrate
来更新所有内容,然后正确呈现了我的Rails Api页面。

呈现json:ActiveModelSerializers::Koboapierializer.new(kobo_信息,{})谢谢-用您建议的内容替换我的呈现json行会给我一个
未初始化常量KoboDataController::ActiveModelSerializers
错误。是否包含活动模型序列化程序gem?请尝试呈现json:KoboApiSerializer.new(kobo_信息,{})我有其他与我的数据库和数据相关的问题,这些问题使我的应用程序在尝试此操作后仍无法工作-下面我发布的答案中详细描述了我的数据库的问题。我想如果我没有与我的数据库表名相关的问题,这会解决问题。稍后将尝试确认。再次感谢!再次访问此问题稍后再给我打电话(我有点经验),我在这里看到我的类名很糟糕。我确实重做了这个项目,并重命名了类
Response
,控制器
responsecontroller
引用变量
@responses
,并调用了我的序列化程序
ResponseSerializer
。表名是
responses
。我确信我仍然可以做一些改进s、 但这样更清楚。
class KoboApis < ActiveRecord::Migration
  def change
    create_table :koboApis do |t|
      t.integer :lemurs_quantity
      t.date  :month_and_year
      t.text :_geolocation
      t.text :lemur_category
    end
  end
end
ActiveRecord::Schema.define(version: 20160620063545) do

  create_table "kobo_apis", force: :cascade do |t|
    t.integer "lemurs_quantity"
    t.date    "month_and_year"
    t.text    "_geolocation"
    t.text    "lemur_category"
  end
end
class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
     rename_table :koboApis, :kobo_apis
  end
end