簡體   English   中英

Ruby on Rails –法拉第GET請求出現NilClass錯誤

[英]Ruby on Rails — NilClass error on Faraday GET request

使用Rails 5.1.4,Ruby 2.4

我正在嘗試使用之前完成的Faraday連接到API,但是沒有出現問題,但是在運行RSpec時出現以下錯誤:

SearchController GET #index返回http成功失敗/錯誤:response = @ conn.get(“ / congress / v1 / members / house /#{state} /current.json”)

 NoMethodError:
   undefined method `get' for nil:NilClass
   Did you mean?  gem
 # ./app/controllers/search_controller.rb:9:in `block in index'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/faraday-0.13.1/lib/faraday/connection.rb:88:in `initialize'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/faraday-0.13.1/lib/faraday.rb:67:in `new'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/faraday-0.13.1/lib/faraday.rb:67:in `new'
 # ./app/controllers/search_controller.rb:5:in `index'
 # ./spec/controllers/search_controller_spec.rb:7:in `block (3 levels) in <top (required)>'

2)用戶可以搜索房屋成員,用戶可以提交有效的州名稱失敗/錯誤:response = @ conn.get(“ / congress / v1 / members / house /#{state} /current.json”)

 NoMethodError:
   undefined method `get' for nil:NilClass
   Did you mean?  gem
 # ./app/controllers/search_controller.rb:9:in `block in index'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/faraday-0.13.1/lib/faraday/connection.rb:88:in `initialize'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/faraday-0.13.1/lib/faraday.rb:67:in `new'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/faraday-0.13.1/lib/faraday.rb:67:in `new'
 # ./app/controllers/search_controller.rb:5:in `index'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/etag.rb:25:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/conditional_get.rb:25:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/head.rb:12:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/session/abstract/id.rb:232:in `context'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/session/abstract/id.rb:226:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/railties-5.1.4/lib/rails/rack/logger.rb:36:in `call_app'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/railties-5.1.4/lib/rails/rack/logger.rb:24:in `block in call'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/railties-5.1.4/lib/rails/rack/logger.rb:24:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/method_override.rb:22:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/runtime.rb:22:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/sendfile.rb:111:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/railties-5.1.4/lib/rails/engine.rb:522:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/urlmap.rb:68:in `block in call'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/urlmap.rb:53:in `each'
 # /Users/user/.rvm/gems/ruby-2.4.0@global/gems/rack-2.0.3/lib/rack/urlmap.rb:53:in `call'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/rack-test-0.7.0/lib/rack/mock_session.rb:30:in `request'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/rack-test-0.7.0/lib/rack/test.rb:249:in `process_request'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/rack-test-0.7.0/lib/rack/test.rb:59:in `get'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/rack_test/browser.rb:69:in `process'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/rack_test/browser.rb:41:in `process_and_follow_redirects'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/rack_test/browser.rb:32:in `submit'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/rack_test/form.rb:78:in `submit'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/rack_test/node.rb:64:in `click'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/node/element.rb:143:in `block in click'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/node/base.rb:85:in `synchronize'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/node/element.rb:143:in `click'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/node/actions.rb:25:in `click_link_or_button'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/session.rb:776:in `block (2 levels) in <class:Session>'
 # /Users/user/.rvm/gems/ruby-2.4.0/gems/capybara-2.15.1/lib/capybara/dsl.rb:50:in `block (2 levels) in <module:DSL>'
 # ./spec/features/user_can_search_by_state_spec.rb:11:in `block (2 levels) in <top (required)>'

這是我的Search控制器,邏輯駐留在這里,直到我可以修復此錯誤並將其提取到其他位置為止:

class SearchController < ApplicationController
  def index
    state = params[:state]
    @conn = Faraday.new(url: "https://api.propublica.org") do |faraday|
      faraday.headers["X-API-KEY"] = "<$MY-API-KEY>"
      faraday.adapter Faraday.default_adapter

      response = @conn.get("/congress/v1/members/house/#{state}/current.json")

    results = JSON.parse(response.body, symbolize_names: true)[:results]
    @members = results.map do |result|
      Member.new(result)
    end
    end
  end
end

徹底的說,這是我的會員模型:

class Member
  attr_reader :name,
              :role,
              :party,
              :district,
              :seniority

  def initialize(attributes = {})
    @name = attributes[:name]
    @role = attributes[:role]
    @party = attributes[:party]
    @district = attributes[:district]
    @seniority = attributes[:seniority]

  end
end

@conn定義不正確,因此當它嘗試調用@conn.get ,實際上是在調用nil.get ,這undefined method get for nil引發了undefined method get for nil 嘗試引用@conn 之前,請確保已定義它。 我已經整理好您的示例以顯示問題:

class SearchController < ApplicationController
  def index
    state = params[:state]
    @conn = Faraday.new(url: "https://api.propublica.org") do |faraday|
      faraday.headers["X-API-KEY"] = "<$MY-API-KEY>"
      faraday.adapter Faraday.default_adapter
      # you are trying to reference @conn here
      response = @conn.get("/congress/v1/members/house/#{state}/current.json")
      results = JSON.parse(response.body, symbolize_names: true)[:results]

      @members = results.map do |result|
        Member.new(result)
      end
    end # but @conn is not defined until you get here
  end
end

如果重構代碼,它應該看起來像這樣:

class SearchController < ApplicationController
  def index
    state = params[:state]
    # fully define your @conn object
    @conn = Faraday.new(url: "https://api.propublica.org") do |faraday|
      faraday.headers["X-API-KEY"] = "<$MY-API-KEY>"
      faraday.adapter Faraday.default_adapter
    end

    # now you can reference it
    response = @conn.get("/congress/v1/members/house/#{state}/current.json")
    results = JSON.parse(response.body, symbolize_names: true)[:results]

    @members = results.map do |result|
      Member.new(result)
    end
  end
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM