рельсы 3 JSON Custom JSON форматирование - PullRequest
3 голосов
/ 19 января 2011

У меня есть коллекция @clients с атрибутами id и email Я хочу сделать этот формат JSON

 [ 
 {"id":" 1","label":"johndoe@yahoo.com","value":"1"},{"id":"  2","label":"paulsmith@gmail.com.com","value":"2"}
]

в clients_controller я определил следующий метод

def search
    @clients = Client.where(:user_id => current_user.id).select('id','email')
    render :partial => "clients/search"
  end

и вот представление _search.json.erb

[ 
 <%= raw @client.map{|client| '{"id":"' +" #{client.id}" +'","label":"' + "#{client.email}" +  '","value":"' +"#{client.id}" +'"}' }.join(",") %>
]

это работает, но я нахожу это бесполезным ... есть ли более элегантный способ создания пользовательского формата json в виде?

Ответы [ 4 ]

8 голосов
/ 11 июня 2012

Используйте вспомогательную функцию, которую вы вызываете из представления, чтобы отформатировать вывод, или библиотечную функцию, которую вы вызываете из контроллера. Пример (позже):

def search
  @clients = Client.where(:user_id => current_user.id).select('id','email')
  respond_to do |format|
    format.html
    format.json do
      render :json => custom_json_for(@clients)
    end
  end
end

private
def custom_json_for(value)
  list = value.map do |client|
    { :id => " #{client.id}",
      :label => client.email.to_s,
      :value => client.id.to_s
    }
  end
  list.to_json
end
6 голосов
/ 19 января 2011

Вам просто нужно использовать метод to_json.В вашем случае это

@client.to_json(:only => [:id, :label, :value])
1 голос
/ 06 июля 2013

Вы можете использовать jBuilder gem из GitHub

для клиентов_controller

def search
    @clients = Client.where(:user_id => current_user.id)
end

и search.json.jbuilder

json.id @clients.id
json.label @clients.email
json.value @clients.id

Для получения дополнительной информацииинформация, которую вы можете посетить Jbuilder на RailsCast

0 голосов
/ 02 июня 2013

Вы можете использовать https://github.com/dewski/json_builder/, чтобы настроить отклик json в представлении и отделить его от контроллера. Хорошо, когда вам нужно добавить некоторые «текущие пользователи» в зависимости от атрибутов, таких как

[{:attending => event.attending?(current_user)}]
...