【问题标题】:Ruby on Rails - Show method for a parsed JSON resultRuby on Rails - 显示解析 JSON 结果的方法
【发布时间】:2017-05-10 03:35:49
【问题描述】:

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

我的 index 方法效果很好,并且可以完美地遍历数据名称。我相信我的路由(使用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}”,从 JSON 结果中提取 {data name} 作为参数,然后呈现带有状态的显示页面更新资料。显然,我不知道如何从解析的 JSON 结果中实际捕获“名称”键作为 show 方法的参数。我尝试创建一个 data_params 方法来包含它,但它不起作用。我尝试在 show 中隐式调用 find 方法的参数(如上),但无济于事。我什至尝试在 params 方法中调用新的 api scrape 并尝试将结果解析为该方法,但什么也没有。

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

关于从这里去哪里有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails json ruby httparty


    【解决方案1】:

    在这个视图中:

    <% @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']) 之类的东西或类似的东西。

    【讨论】:

    • 效果很好!谢谢。老实说,我非常接近偶然发现该代码,但它并没有完全实现。我相信我得到的最接近的是 name_path(@data['name']),它引发了同样的错误。
    • 有道理 - 我发现 Rails 中路径生成的神奇方法相当令人困惑。我花了很多时间才习惯它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    • 2011-03-08
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多