rails 3 json自定义json格式

时间:2011-01-19 08:53:35

标签: json ruby-on-rails-3 formatting view

我有一组带有属性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格式?

4 个答案:

答案 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)}]