【问题标题】:Getting Rails 5 app to return JSON API format让 Rails 5 应用程序返回 JSON API 格式
【发布时间】:2017-11-19 17:58:20
【问题描述】:

我正在尝试让我的应用以小写驼峰形式返回,以便最终格式化 JSON API。

我已安装 gem 'active_model_serializers' 并创建了一个新的初始化程序,其中包含以下代码:

ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :camel_lower

然后我有一个返回 json 的小 API,就像所有最好的互联网应用程序一样:

class Api::V1::UsersController < API::V1::BaseController
  def sky
      @user = User.find_by_id(params[:user_id])

      if @user
          obj =  {
              sky: {
                  sectors: @user.sectors,
                  slots: @user.slots
              }
          }

          render json: obj
      else
          raise "Unable to get Sky"
      end
  end

有关 API 控制器继承模式的更多信息:class API::V1::BaseController &lt; ActionController::Base

问题

在我的 API 响应中,事情仍然是蛇形的,我在控制台 [active_model_serializers] Rendered ActiveModel::Serializer::Null 中看到了这个错误,但我的研究让我陷入了死胡同。

非常欢迎任何建议。谢谢!

【问题讨论】:

  • 这是一个 rails 应用程序,不是 rails-api 应用程序,fwiw

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


【解决方案1】:

从这个拉取请求 (*) 看来,您应该能够在 ActiveModel::Serializers 配置中配置 key_format = :lower_camel

(*)https://github.com/rails-api/active_model_serializers/pull/534

【讨论】:

    【解决方案2】:

    问题是您没有在控制器中调用活动记录序列化程序,因此这些配置设置没有被拾取。

    解决方案: 在"app/serializers/user_serializer.rb" 中创建一个UserSerializer,看起来应该是这样的:

    class UserSerializer < ActiveModel::Serializer
      attributes :id
    
      has_many :sectors
      has_many :slots
    end
    

    以及具有相似结构的 SectorSerializerSlotSerializer 以及您想要的所有属性(这里是活动记录序列化程序的 getting started docsgeneral syntax docs

    然后在你的控制器中:

    class Api::V1::UsersController < API::V1::BaseController
      def sky
        @user = User.includes(:sectors, :slots).find_by_id(params[:user_id])
    
        if @user
          render json: @user
        else
          raise "Unable to get Sky"
        end
      end
    end
    

    这将使用 includes 急切加载 :slots 和 :sectors,然后使用您的 camel_case 配置选项调用您的 UserSerializer

    【讨论】:

    • 没有。它仍然是骆驼壳
    • 蛇壳,而不是
    • @zack 您正在使用哪个版本的活动模型序列化程序?
    • 运行bundle show | grep active_model_serializers获取版本
    • active_model_serializers (0.10.6)
    【解决方案3】:

    在你的控制器中放入 respond_to :json

    class Api::V1::UsersController < API::V1::BaseController
    
      respond_to :json
    

    并在动作中放入与您相同的操作

    def sky
       ...      
       render json: obj
       ...       
    end
    

    并在基本控制器中定义

    protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }
    

    【讨论】:

    • 还是蛇套
    【解决方案4】:

    我认为它可以帮助你。在我的情况下,我使用 gem 'active_model_serializers', '~&gt; 0.10.5' 这取决于 case_transform (&gt;= 0.2)

    rails console我可以做到

    CaseTransform.camel_lower(initially_serialized_output)                                                       
    => {:name=>"My Company", :jsonThings=>{:rating=>8, :aKey=>{:aSubkey=>{:anotherKey=>"value"}}}}
    

    我的研究是按步骤进行的: https://github.com/rails-api/active_model_serializers/pull/1993 => https://github.com/NullVoxPopuli/case_transform-rust-extensions

    你找到了吗?

    【讨论】:

    • initially_serialized_output = { "name": "My Company", "json_things": { "rating": 8, "a_key": { "a_subkey": { "another_key": "value" } } } }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2018-11-17
    • 2019-05-18
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 2021-12-20
    相关资源
    最近更新 更多