【问题标题】:how to display json and parse json in ruby using httparty如何使用httparty在ruby中显示json和解析json
【发布时间】:2016-07-30 11:57:01
【问题描述】:

我正在使用 ruby​​ on rails 开发一个食品应用程序,它需要从食品 api 获取食品的卡路里值。在我的控制器中,我得到 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

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

【问题讨论】:

  • 您要在哪个操作中查看数据?索引
  • @mohamed-ibrahim 感谢您的编辑。我想在此 url api.nutritionix.com/v1_1/search/… 中提取食品的卡路里值,例如牛奶,并在 index.html.erb 文件中显示卡路里值
  • @mohamed-ibrahim 在创建食物对象后的创建操作中
  • 对象创建后重定向到索引

标签: ruby ruby-on-rails-3 api parsing httparty


【解决方案1】:

您可以向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

【讨论】:

  • 我在构建时没有在 Food 模型中定义卡路里值,所以它在 food.calorie 处给出错误现在可以添加它吗?
  • 我是通过教程学习 ruby​​ 的新手,也没有有用且简单的教程:(
  • 检查api.rubyonrails.org/classes/ActiveRecord/Migration.html它将是rails g migration add_calorie_to_foods calorie:float
  • 感谢工作我能够获取食物的卡路里值,但是如何在foods_controller 的创建方法中保存每种食物的食物实例中的卡路里值,这样我就不必进行 api 调用一次又一次
  • 我尝试更新食物项目的卡路里属性,但在 index.html.erb 文件中没有显示任何内容。在应用您的更新之前,我正在尝试这样,请参阅我的 index.html.erb textuploader.com/5evtc和textuploader.com/5evth 的食品控制员,这是我得到i.imgsafe.org/d9ada84b44.png 的回复,现在通过您的修改,我没有任何东西可以代替卡路里值,请帮助
猜你喜欢
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多