我有一组带有属性ID和电子邮件的@clients 我想渲染这个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格式?
答案 0 :(得分:8)
使用从视图中调用的辅助函数来格式化输出或从控制器调用的库函数。示例(稍后):
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
答案 1 :(得分:6)
您只需要使用to_json方法。在你的情况下它是
@client.to_json(:only => [:id, :label, :value])
答案 2 :(得分:1)
您可以使用GitHub中的jBuilder gem
for 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
答案 3 :(得分:0)
您可以使用https://github.com/dewski/json_builder/在视图中自定义json响应,并将其与控制器分开。当您需要根据
等属性添加一些“当前用户”时,这很好[{:attending => event.attending?(current_user)}]