在循环中附加到JSON数组

时间:2014-04-07 15:23:20

标签: ruby-on-rails ruby arrays json rest

需要提交json字符串的HTTP POST请求。 让所有RESTful部件都正常工作,并进行正确验证。 如果我硬编码数组中的元素,这是有效的。我想循环遍历JSON字符串中的一个数组,即“附件数组”。

循环看起来像:

@days = Daily.all
@days[0..11] do |dailys|
    #loop that builds json to post
end
#RESTful HTTP POST request

唯一的问题是,我不知道如何在一个JSON字符串中只为一个数组实现一个循环。

到目前为止,我的代码用于测试HTTP POST

#!/usr/bin/ruby

require 'net/http'
require 'uri'
require 'json'
require 'jbuilder'

uri = URI.parse("<POST URL>")

header = {'Content-Type' => 'text/json'}

payload = {
    channel: "<channel>",
    username: "<username>",
    # Wish to loop through the "Attachments" Array
    attachments: [
        {
            param: "Text",
            text: "Text",
            pretext: "Optional Text",
            color: 'good',
            fields: [
            {
                Title: "Title field",
                value: "First Value",
                short: false
            },
            {
                title: "Field Title",
                value: "Field Value",
                short: true
            },
            {
                title: "Second Field Title",
                value: "Second Field Value",
                short: true
            }
            ]
        }
    ]
}


http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true

req = Net::HTTP::Post.new(uri.request_uri, header)
req.body = payload.to_json

resp = http.request(req)
puts resp

1 个答案:

答案 0 :(得分:3)

你的代码循环遍历一堆Daily对象(虽然你在循环中调用每一个'dailys'会令人困惑)。你没有真正解释你想做什么,但是如果你想使用你拥有的每日对象的一些属性制作一个json对象,你就可以这样做。

hash = Daily.find(:all, :limit => 12).map{|daily| {:foo => daily.bar, :chunky => daily.chicken}}.to_json

如果你从日常对象中提供你想要制作的json字符串的一些细节,那么我可以给你一些不那么愚蠢的代码,但方法是正确的:构建一个ruby数据结构然后用{{1将它转换为json }}

编辑:继续你的评论,我会这样做。

to_json

几个笔记: 1)hash = Daily.find(:all, :limit => 12, :order => "id desc").map{|daily| {param: daily.title, fields: [{title: "Task Completed?", value: daily.completed, short: true}]} } json = hash.to_json 是一个类,而不是一个对象(虽然类也是Ruby中的对象,我认为在rails中最好将它称为类。
2)通过Daily我假设你的意思是最近保存的记录:这就是:order选项的用途。