Ruby on Rails - 显示已解析的JSON结果的方法

时间:2017-05-10 03:35:49

标签: ruby-on-rails json ruby httparty

我正在为访问者构建一个看似简单的网站,以获取所选数据的状态更新。数据来自外部API。它的要点是:访问者看到数据名称列表,单击一个,并重定向到状态更新的部分,无论是真还是假。

我的索引方法运行良好,并完美地遍历数据名称。我相信我的路由(使用friendly_id gem)应该可以正常工作。但是,我无法弄清楚如何正确设置show方法。

到目前为止,这是我的代码:

控制器:

class DataController < ApplicationController
  include HTTParty
  attr_accessor :name, :status

  def index
    @response = HTTParty.get("api_url").parsed_response
     respond_to do |format|
      format.json { render :json => JSON.parse(@result, :include => { :data => { :only => [:name, :status]}}) }
      format.html { render "index.html.erb" }
     end
   end


  def show
    @response = HTTParty.get('api_url').parsed_response
    respond_to do |format|
      format.json { render :json => JSON.parse(@result, :include => { :data => { :only => [:name, :status]}}) }
      format.html { render "show.html.erb" }
    end
    @name = @response.find(params[:name])
  end
end

查看:

<% @response.each do |data| %>
  <ul>
    <li>
      <%= link_to data['name'].upcase, name_path(@name) %>
    </li>
  </ul>
<% end %>

路线:

Rails.application.routes.draw do
  root 'data#index'
  get '/:name' => 'data#show', as: "name"
end

所有这些都会带来以下错误:

ActionController::UrlGenerationError in Data#index
Showing /app/views/layouts/_header.html.erb where line #11 raised:

No route matches {:action=>"show", :controller=>"data", :name=>nil} missing required keys: [:name]

我想要完成的是能够将每个迭代链接路由为“root / {data name}”,将{data name}从JSON结果中拉出作为参数,然后呈现具有状态的显示页面更新资料。显然,我不知道如何从解析的JSON结果中实际捕获“name”键作为show方法的参数。我已经尝试创建一个data_params方法来包含它,但它没有用。我试过隐式调用show中的find方法上的param(如上所述),但无济于事。我甚至尝试用params方法调用一个新的api scrape并试图将结果解析为那个,什么都没有。

我猜这是一个非常简单的错误,我没有看到(我的link_to实际指向正确的方向吗?是我的api调用和JSON解析正确完成[是的,我知道我应该创建一个单独的方法或api调用的助手,但到目前为止还没有为我工作 - 我一直在破坏应用程序]?这个链接实际上应该从索引方法调用吗?),或者更多的东西更多的我的深度。

关于从哪里去的任何想法?

1 个答案:

答案 0 :(得分:2)

在这个视图中:

<% @response.each do |data| %>
  <ul>
    <li>
      <%= link_to data['name'].upcase, name_path(@name) %>
    </li>
  </ul>
<% end %>

您正在使用@name,但实际上您从未在index控制器方法中为其分配值。结果 - 它被传递给name_path函数,其值为nil。这会引发错误,因为您的路线定义需要name

我认为你想要name_path(data['name'])或类似的东西。