编写一个以跟踪代码为输入的函数。在JSON中查找跟踪代码,然后返回跟踪代码作为输出

时间:2017-04-17 14:58:44

标签: json ruby

我有一个名为“tracking.json”的JSON文件。

[
{
    "tracking_number": "IN175417577",
    "status": "IN_TRANSIT",
    "address": "237 Pentonville Road, N1 9NG"
},
    {
    "tracking_number": "IN175417578",
    "status": "NOT_DISPATCHED",
    "address": "Holly House, Dale Road, Coalbrookdale, TF8 7DT"
},
    {
    "tracking_number": "IN175417579",
    "status": "DELIVERED",
    "address": "Number 10 Downing Street, London, SW1A 2AA"
}
]

我在app.rb文件中写了一个函数:

def compare_content(tracking_number)
 json_string = File.read("pages/tracking.json")
 # Uses the JSON module to create an array from the JSON string
 array_from_json = JSON.parse(json_string)
 # Iterates through the array of hashes
 array_from_json.each do |tracking_hash|
  if tracking_number == tracking_hash["tracking_number"]
    print "Package on its way"
 else
  print "Tracking Number does not exist"
    end
  end
end

页面的路线是:

get "/:tracking_number/status" do
@tracking_number = params[:tracking_number]
compare_content(@tracking_number)
erb :status
end

erb:状态页面是:

<h1>Status Pages: <%= @tracking_number %></h1>

<div>
   <h3>Package is on its way</h3>
</div>

<a href="/"> Back to Index</a>

如果包与跟踪号匹配,如何显示状态?另外,如果不是,我怎么表明没有匹配?

1 个答案:

答案 0 :(得分:1)

您的代码可以简化为:

require 'json'

JSON_DATA = JSON[<<EOT]
[
  {
    "tracking_number": "IN175417577",
    "status": "IN_TRANSIT",
    "address": "237 Pentonville Road, N1 9NG"
  },
  {
    "tracking_number": "IN175417578",
    "status": "NOT_DISPATCHED",
    "address": "Holly House, Dale Road, Coalbrookdale, TF8 7DT"
  },
  {
    "tracking_number": "IN175417579",
    "status": "DELIVERED",
    "address": "Number 10 Downing Street, London, SW1A 2AA"
  }
]
EOT

def compare_content(tracking_number)
  msg = if JSON_DATA.any? { |h| tracking_number == h['tracking_number'] }
          "Package on its way"
        else
          "Tracking Number does not exist"
        end
  puts msg
end

compare_content('IN175417577')
compare_content('IN175417560')

# >> Package on its way
# >> Tracking Number does not exist

您可能需要考虑status字段,以显示该套餐是否实际在运送中。

注意,我们很少在Ruby中使用printputs更聪明,知道何时添加尾随的“\ n”。 print从不添加尾随换行符,因此您必须明确地这样做。这通常是一件好事,但通常会抓住puts,并在您需要的极少数情况下将print放在后袋中。