如何使用 httparty 在 ruby 中显示 json 和解析 json

how to display json and parse json in ruby using httparty

我正在 ruby 的 rails 开发一个食品应用程序,它需要从食物中获取食品的卡路里值 api.In 我的控制器正在 JSON 响应,但我无法在 index.html.erb 文件中解析和显示食品的卡路里值,这里是我的控制器代码。

require 'rubygems'
require 'httparty'

class FoodsController < ApplicationController

  def index
    @foods = Food.all
  end

  def show
    @food = Food.find(params[:id])
  end

  def new
   @food = Food.new
  end

  def edit
   @food = Food.find(params[:id])
 end

 def create
   @food = Food.new(food_params)

   @response = HTTParty.get('http://api.nutritionix.com/v1_1/search/'+@food.name+'?fields=item_name%2Citem_id%2Cbrand_name%2Cnf_serving_size_unit%2Cnf_calories%2Cnf_total_fat&appId=696d1ad4&appKey=aec2c4766d40d7f6346ed89d5d82fe75')
   @http_party_json = JSON.parse(@response.body)

  if @food.save
   redirect_to foods_path
  else
    render 'new'
  end
end


def update
  @food = Food.find(params[:id])

  if @food.update(food_params)
   redirect_to @food
  else
   render 'edit'
  end
end

def destroy
  @food = Food.find(params[:id])
  @food.destroy

  redirect_to foods_path
end

private
def food_params
  params.require(:food).permit(:name, :quantity)
end

end

非常欢迎任何建议,因为我是 Whosebug 的新手,所以不知道正确的编辑请原谅!帮助我如何在 html 页面

中显示卡路里值

您可以向 Food 模型添加一个新函数来计算卡路里:

class Food 

 def calorie
  response = HTTParty.get("http://api.nutritionix.com/v1_1/search/#{self.name}?fields=item_name%2Citem_id%2Cbrand_name%2Cnf_serving_size_unit%2Cnf_calories%2Cnf_total_fat&appId=696d1ad4&appKey=aec2c4766d40d7f6346ed89d5d82fe75")
  json = JSON.parse(response.body)
 end
end

如果你遍历 foods 集合,然后在你的 index.erb 中简单地执行以下操作:

<% @foods.each do |food| %>
   <%= food.name %>
   <%= food.calorie %>
<% end %>

但那样的话性能会不好,因为每次显示数据时,你都会对每个项目进行远程访问,所以对于相同的食物,卡路里值总是相同的,那么在创建后你可以进行远程查询并将卡路里存储到 Food 模型

中的 calorie 属性

您可以执行以下操作:

class Food < ActiveRecord::Base
  before_create :set_calorie

  private
  def set_calorie
    response = HTTParty.get("http://api.nutritionix.com/v1_1/search/#{self.name}?fields=item_name%2Citem_id%2Cbrand_name%2Cnf_serving_size_unit%2Cnf_calories%2Cnf_total_fat&appId=696d1ad4&appKey=aec2c4766d40d7f6346ed89d5d82fe75")
    self.calorie = JSON.parse(response.body)
  end
end