ruby-on-rails - Rails Serializer 不过滤数据

标签 ruby-on-rails json active-model-serializers

我正在尝试在 Rails API 应用程序中的 API 返回的 JSON 对象上使用 Rail 的序列化程序。我需要进行身份验证、摄取 API、过滤数据并重新广播过滤后的数据。不需要 View 。

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

我已经尝试在与此类似的线程中解决问题( ActiveModel::Serializer in Rails - serializer methods ignored in JSON resultrails active model serializer not doing anythingUsing ActiveModel::Serializer in Rails - JSON data differs between json and index response ),但由于我没有 .html View ,我想知道这是否与中提到的问题有关最后一个链接。但是我完成的另一个教程( https://thesocietea.org/2015/03/building-a-json-api-with-rails-part-2-serialization/ )在没有 View 的 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

Controller
class KoboDataController < ApplicationController
    def index
        @kobo_info = KoboApi.get_api_info
        render json: @kobo_info
    end
end

应用 Controller
class ApplicationController < ActionController::API
    include ActionController::Serialization
end

kobo_api_serializer.rb
class KoboApiSerializer < ActiveModel::Serializer
  attributes :prikey
end

gem 文件
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'

数据返回
{"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]

最佳答案

我刚刚与一个带我解决我遇到的问题的人交谈过,并非所有问题都与我上面发布的代码有关。我在这里发布一些细节。我确信还有其他方法可以解决这个问题,但这就是我们介绍它的方式。希望它有帮助。

主要问题:否 each_serializer
与上面发布的语言特别相关:我不包括对 each_serializer 的引用在我的 render在我的模型中声明。此问题也在此线程中引用:rails active model serializer not doing anything .

Controller

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

如果我的数据库配置正确,这应该已经为我修复了。

另外,以防万一Active Model Serializers 出现问题我正在使用,我们更新了我的 gem 文件以用以下内容替换我的行( gem 'active_model_serializers', '~> 0.8.3' ):
gem 'active_model_serializers', :git => 'git://github.com/AskNative/active_model_serializers.git', :branch => '0-8-stable'  

第二个问题:数据库表名不正确

但是,我创建的两个字的表名有问题。我已经用驼峰命名结构创建了我的表,而 rails 期待着 separator_words(即:带下划线)。

可以看到这里的表名是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

您可以在我的原始模式中看到表名确实是 kobo_apis ,而不是“koboApis”。

架构
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

由于这个原因,Rails 期望的表甚至不存在。

我们通过在终端运行第二次迁移来解决这个问题:rails g migration RenameOldTableToNewTable .然后我将此逻辑添加到新的迁移文件中:rename_table :koboApis, :kobo_apis .整个迁移文件在这里:

更新迁移文件
class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
     rename_table :koboApis, :kobo_apis
  end
end

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

关于ruby-on-rails - Rails Serializer 不过滤数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902930/

相关文章:

ruby-on-rails - 在 Ruby 中打开 .doc 文件

ruby-on-rails - Cucumber:如何在 After block 中获取标签列表?

java - 如何在 JSON 字符串中的日期时间值中转义冒号

php - org.json.JSONException : Value <br of type java. lang.String 无法转换为 JSONObject

json - ActiveModelSerializers 多态 Json

ruby-on-rails - 在 Ruby on Rails 中在 Controller 之间重用代码的最佳实践

ruby-on-rails - 未定义的方法包括?无 :NilClass

javascript - 使用 JavaScript 的 md5 的较短版本..?

ruby-on-rails - Rails Active Model Serializer 包含在 Controller 中不注入(inject)在包含的参数中有很多关系

ruby-on-rails - 如何为多对多关系编写activemodel序列化程序?