2015-05-23 78 views
0

我在Rails中遇到串行器問題。我試圖爲我的模型呈現自定義json。爲此,我將active_model_serializer添加到我的Gemfile並編寫了一些Serializer。問題是,當我渲染JSON時,它渲染我的整個對象而不是調用序列化程序。ActiveModel :: Serializer在渲染JSON時未使用

這裏是我的代碼

用戶串行

class UserSerializer < ActiveModel::Serializer 
    attributes :id, :email 
end 

用戶模型

# Class model for users 
class User < ActiveRecord::Base 
    ... 
end 

響應模型

class Response 
    attr_accessor :status, :data 
end 

顯示方法

def send_response(*args) 
    r = Response.new 
    r.status = args[0] # This is the HTTP code 
    r.data = args[1] # This is a user object 
    render json: r, status: r.status 
end 

的Gemfile

source 'https://rubygems.org' 

gem 'rails', '4.2.0' 
gem 'pg' 
gem 'sass-rails', '~> 5.0' 
gem 'uglifier', '>= 1.3.0' 
gem 'coffee-rails', '~> 4.1.0' 
gem 'devise' 
gem 'jquery-rails' 
gem 'turbolinks' 
gem 'jbuilder', '~> 2.0' 
gem 'sdoc', '~> 0.4.0', group: :doc 
gem 'omniauth' 
gem 'active_model_serializers' 

group :development, :test do 
    gem 'byebug' 
    gem 'web-console', '~> 2.0' 
    gem 'spring' 
end 
+0

是什麼'Response'? – apneadiving

+0

它是一個象徵HTTP響應的Ruby對象。我會用它的代碼編輯這個問題,如果你想輕鬆理解它 – Aeradriel

+1

從控制檯試試這個併發布你的響應..'puts JSON.pretty_generate(UserSerializer.new(User.first).serializable_hash)' – errata

回答

0

你將不得不爲Response創建一個串行爲好。當你將一個普通對象傳遞給render json:時,它只會嘗試在該對象上調用.to_json。它不知道序列化器甚至存在嵌套對象。

class ResponseSerializer < ActiveModel::Serializer 
    attributes :title, :body 
    belongs_to :user 
end 

-

def send_response(*args) 
    r = Response.new 
    r.status = args[0] # This is the HTTP code 
    r.data = args[1] # This is a user object 
    render json: r, status: r.status 
end 
+0

無可否認,我不知道你在嘗試實現什麼,因爲你的代碼非常非常規 - Rails已經有了一個響應對象。通過'* args'得到params就很奇怪。 – max

+0

就像我在評論中所說的,沒有嵌套對象的事件,序列化程序沒有被調用。調用'render json:User.first'將不會調用序列化程序。 關於Rails Response對象,我不知道。 – Aeradriel

+0

如果指定序列化程序會怎樣? 'render json:@user,serializer:UserSerializer'。另外,您可能想要了解rails控制器如何實際工作以及請求和響應對象http://guides.rubyonrails.org/action_controller_overview.html#the-request-and-response-objects – max

相關問題