2011-01-19 4 views
2

У меня есть коллекция @clients с атрибутами Ид и электронной почты Я хочу сделать этот JSon Отформатируйтерельсы 3 пользовательских JSON JSON форматирования

[ 
{"id":" 1","label":"[email protected]","value":"1"},{"id":" 2","label":"[email protected]","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(",") %> 
] 

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

ответ

6

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

@client.to_json(:only => [:id, :label, :value]) 
+0

Это не для пользовательского формата вывода, который мне нужен. Я уточнил свой вопрос, какие-то другие идеи? – Alpha

+0

'@ client.to_json (...)' выводит стандартный json. Вы можете уточнить, что вы подразумеваете под * custom *? Если вы имеете в виду изменение пробелов, новых строк и т. Д., То ваше решение будет правильным. Однако вам не нужно создавать пользовательский вывод для json, иначе вы не будете говорить о стандартизованном json. – Sukima

7

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

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 
+0

Для более развязанного и масштабируемого решения проверьте [шаблоны RABL] (https://github.com/ccocchi/rabl-rails). – Sukima

0

Вы можете использовать https://github.com/dewski/json_builder/ настроить свой ответ JSON в представлении и отделить его от контроллера. Это хорошо, когда вам нужно добавить "текущий пользователь" в зависимости атрибутов, как

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

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

для clients_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 on RailsCast