2017-06-16 15 views
2

我正在構建一個帶有Rails後端的JS應用程序,爲了不混淆蛇和駱駝事件,我想通過從服務器返回camelcase鍵名來規範化它。因此,當從API返回時,user.last_name將返回user.lastName如何使用camelcased鍵名從Rails返回JSON

我該如何做到這一點?謝謝!

編輯:新增控制器代碼

class Api::V1::UsersController < API::V1::BaseController 
    # authorize_resource 
    respond_to :json, only: [:index] 
    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 
end 

回答

8

我這樣做是使用ActiveModelSerializer和json_api適配器的方式:

在你的Gemfile,添加:

gem 'active_model_serializers' 

創建新文件/config/initializers/ams.rb包含:

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

你的控制器動作應該是這樣的:

class ApiController < ApplicationController 
    def sky 
    @user = User.find_by_id(params[:user_id]) 

    if @user 
     render json: @user, serializer: UserSkySerializer 
    else 
     raise "Unable to get Sky" 
    end 
    end 
end 

現在,你需要創建一個串行器。首先,創建一個新目錄app/serializers/

接下來,創建一個新的串行app/serializers/user_sky_serializer.rb,包含:

class UserSkySerializer < ActiveModel::Serializer 
    attributes :sectors, :slots 
end 

結果將類似於你在obj哈希描述什麼,但所有的屬性鍵將在駝峯使用jsonapi標準呈現。

+0

感謝moveson,我這樣做,並且我得到了JSON序列化版本'[active_model_serializers]加載ActiveModel渲染::串行::空與Hash'在我的控制檯。這裏的任何想法? –

+0

難道是因爲如果我的繼承? '類的API :: V1 :: UsersController

+0

FWIW,這是一個Rails應用程序,而不是一個軌道的API的應用程序 –

-1

你可以用ruby的method_missing方法實現。

創建一個類似concerns/method_missing_extension.rb的文件,並在其中添加以下代碼。

module MethodMissingExtension 
    def method_missing(method_name, args = {}) 
    if self.class.column_names.include? method_name.to_s.underscore 
     send method_name.to_s.underscore.to_sym 
    else 
     super 
    end 
    end 
end 

將此模塊包含在每個模型中,如include MethodMissingExtension

現在,只要你做user.firstName然後user.first_name將返回。

+0

我討厭downvote的沒有理由。 Downvoters任何理由downvote? –

+0

當然,我投了票,因爲類似的答案已經存在,我寫了一個評論,說明爲什麼。我只把它投下來,作爲未來遇到這個問題的人的一個信號,說明正確的答案可能在哪裏。希望清除它 –

+0

這個答案是非常不同的。他們的'method_missing'的實現有點不同,需要爲每個模型的每個屬性創建它。但是,這裏只有一次寫入的模塊可以包含在所有需要的「模型」中,並且您可以獲得理想的結果。希望它能澄清你的困惑。 –

0

你沒有提到你的Rails版本,所以對於其他尋找這個的人,我會提到在Rails 5中,答案是使用ActiveSupport::Inflector中的#camelize。就我而言,我不得不把它調用鏈上的ActiveRecord模型(t下圖):

def index 
    trucks = AvailableTruck.all.map do |t| 
     t.as_json(only: AvailableTruck.exposed) 
     .deep_transform_keys(&:camelize).deep_transform_values(&:upcase) 
    end 
    render json: trucks 
    end 

#deep_transform_keys根據您的應用程序可能會或可能不會是必要的。

+0

我正在使用Rails 5 –

+0

在你的例子中't'是什麼?你可以給你的代碼多一點背景嗎? –

+0

那麼也許它會更好地使用這種方法? –