rails 3 json自定义json格式

Alp*_*pha 3 formatting json view ruby-on-rails-3

我有一个带有属性id和电子邮件的@clients集合我想呈现这个json格式

 [ 
 {"id":" 1","label":"johndoe@yahoo.com","value":"1"},{"id":"  2","label":"paulsmith@gmail.com.com","value":"2"}
]
Run Code Online (Sandbox Code Playgroud)

在clients_controller中我定义了以下方法

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

这是视图_search.json.erb

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

这是有效的,但我发现它很难...是否有更优雅的方式在视图中生成自定义json格式?

Suk*_*ima 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
Run Code Online (Sandbox Code Playgroud)


shi*_*ara 6

您只需要使用to_json方法.在你的情况下它是

@client.to_json(:only => [:id, :label, :value])
Run Code Online (Sandbox Code Playgroud)