2015-05-23 3 views
0

У меня проблема с сериализаторами в Rails. Я пытаюсь сделать пользовательский json для своих моделей. Для этого я добавил active_model_serializer в свой Gemfile и написал несколько сериализаторов. Проблема заключается в том, что когда я обрабатываю JSON, он обрабатывает весь мой объект, а не вызывает сериализатор.ActiveModel :: Сериализатор, не используемый при рендеринге JSON

Вот мой код

Serializer Пользователь

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

пользователя Модель

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

Модель Response

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

Это объект Ruby, который символизирует HTTP-отклик. Я отредактирую вопрос с его кодом, если вы хотите легко его понять. – 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' просто странно. – max

+0

Как я уже сказал в комментарии, событие без вложенных объектов, сериализатор в не вызываемом. Вызов 'render json: User.first' не будет вызывать сериализатор. О Rails Ответ объекта, я не знал. – Aeradriel

+0

Что делать, если вы указали сериализатор? 'render json: @user, serializer: UserSerializer'. Также вы можете прочитать, как работают контроллеры рельсов, а также объекты запроса и ответа. Http://guides.rubyonrails.org/action_controller_overview.html#the-request-and-response-objects – max

Смежные вопросы