首先,我必须说我只是学习Ruby on Rails。 我试图通过法拉第从数字海洋获取水滴列表。
这是我的代码:
module DropletsHelper
require 'faraday'
require 'json'
@token = ENV["DO_TOKEN"]
@conn = Faraday.new(:url => 'https://api.digitalocean.com', :ssl => {:verify => false})
def droplets_all
request = @conn.get do |req|
req.url '/v2/droplets'
req.headers['Authorization'] = @token
end
droplets = JSON.parse(request.body)
droplets = droplets["droplets"]
return droplets
end
end
此代码仅返回#<Faraday::Connection:0x007fc3574b4f98>
在应用程序中我收到一个错误:
undefined method 'get' for nil:NilClass
我做错了什么?这段代码完全适用于irb。
谢谢。
答案 0 :(得分:2)
这是一个友好的提醒,你不能假装使用Rails,而不学习Ruby的基础知识。这个问题不是Rails问题,它是一个Ruby问题。
您的代码存在一些问题。
首先,您使用模块。模块无法实例化(只有一个类),但您的代码使用@instance
个变量(这是一种矛盾)。
您将初始化代码放在Module上下文中,该上下文在解析Ruby代码时评估,而不是在执行时评估。
最简单的解决方案是更改要在方法中评估的代码。
require 'faraday'
require 'json'
module DropletsHelper
def droplets_connection
Faraday.new(:url => 'https://api.digitalocean.com', :ssl => {:verify => false})
end
def droplets_all
request = droplets_connection.get do |req|
req.url '/v2/droplets'
req.headers['Authorization'] = ENV["DO_TOKEN"]
end
droplets = JSON.parse(request.body)
droplets["droplets"]
end
end
我认为这是一个将在视图中执行的Rails助手。
然而,最好的解决方案是在自定义库中提取lib
中的代码,并在助手中引用一个简单的执行。通过这种方式,您可以更轻松地对库进行单元测试,而无需引导完整的Rails视图堆栈。
最后但并非最不重要
:ssl => {:verify => false}
是一个非常糟糕的主意。你应该关心安全。
答案 1 :(得分:0)
我不是Ruby开发人员,但错误似乎很清楚。
@conn
为nil
(NULL
),当然您无法访问任何方法。您应该在使用之前检查@conn
。可能这里有一些错误:
@conn = Faraday.new(:url => 'https://api.digitalocean.com', :ssl => {:verify => false})
因为它什么都没有返回
答案 2 :(得分:0)
@token和@return不是。它们是绑定到DropletsHelper的实例变量,DropletHelper是Module类的一个实例。
我认为解决问题的最简单方法是将drorplets_all更改为类方法。
def self.droplets_all
...
end
或者你可以在DropletsHelper中设置@conn和@token。每次调用drops_all时都要注意不要初始化它们。
def droplets_all
@token ||= ENV["DO_TOKEN"]
@conn ||= Faraday.new(...)
...
end