2016-01-25 2 views
0

Я хочу установить поля со значением, передаваемым через URL. Например, прямо сейчас я могу это сделать:Параметр передающих полей для AMS JSONAPI serializer

def index 
    authors = Author.all 
    render json: authors, include: params[:include], fields: {authors: [:id], posts: [:title]} 
end 

И это работает именно так, как я этого хочу. Он возвращается только с идентификатором автора и названием своих сообщений. То, что я хотел бы сделать что-то вроде этого:

def index 
    authors = Author.all 
    render json: authors, include: params[:include], fields: params[:fields] 
end 

И это будет делать то же самое, как и раньше, когда я использую этот URL: http://localhost:3000/authors?include=posts&fields[author]=[id]&fields[posts]=[title] Однако, когда я делаю, что я получаю все поля на авторов и все поля в сообщениях.

Вот мои сериализаторы для справки:

class AuthorSerializer < ActiveModel::Serializer 
    attributes :id, :name 
    has_many :posts 
end 

class PostSerializer < ActiveModel::Serializer 
    attributes :id, :title, :text 
    belongs_to :author 
    has_many :comments 
end 

ответ

0

"поле" часть URL приведет к Rails params будучи так:

{ 
    "fields" => { 
    "author" => "[id]", 
    "posts" => "[title]" 
    } 
} 

, как вы можете видеть, что есть [] вокруг ваших атрибутов, поэтому вам нужно их удалить.

Во-вторых, если вы хотите иметь возможность запрашивать несколько атрибутов с вашей модели Post, то передайте title,text в свой URL. Вам также нужно будет преобразовать 'title,text' в массив, прежде чем передать его всем аргументам «поля» render.

(Примечание: Это может измениться в будущих версиях Active Model сериализаторы, так как адаптер JsonApi еще находится в стадии разработки ..)