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

Ruby on Rails - Show method for a parsed JSON result

我正在构建一个看似简单的网站,供访问者获取所选数据片段的状态更新。数据来自外部API。它的要点是这样的:访问者看到一个数据名称列表,单击其中一个,然后被重定向到状态更新的部分,True 或 False。

我的索引方法效果很好,可以完美地遍历数据名称。我相信我的路由(使用 friendly_id gem)应该可以正常工作。但是,我不知道如何正确设置显示方法。

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

控制器:

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]

我想要完成的是能够将每个迭代的 link 路由为 'root/{data name}',从 JSON 结果中提取 {data name} 作为参数,然后呈现带有状态更新信息的显示页面。显然,我不知道如何从解析的 JSON 结果中实际捕获 "name" 键作为 show 方法的参数。我尝试创建一个 data_params 方法来包含它,但它没有用。我曾尝试在 show 中隐式调用 find 方法的参数(如上所述),但无济于事。我什至尝试在 params 方法中调用一个新的 api scrape,并尝试将结果解析为该方法,但什么也没有。

我猜这是我没有看到的一些非常简单的错误(我的 link_to 实际上指向正确的方向吗?我的 api 调用和 JSON 解析正确完成 [是的,我知道我应该为 api 调用创建一个单独的方法或助手,但到目前为止我还没有成功——我一直在破坏应用程序]?这是 link 实际上仍然应该从 index 方法调用?),或者其他一些超出我理解范围的东西。

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

在此视图中:

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

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

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