如何在Ruby on Rails中使用法拉第?

时间:2015-01-18 10:38:58

标签: ruby-on-rails ruby

首先,我必须说我只是学习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。

谢谢。

3 个答案:

答案 0 :(得分:2)

这是一个友好的提醒,你不能假装使用Rails,而不学习Ruby的基础知识。这个问题不是Rails问题,它是一个Ruby问题。

您的代码存在一些问题。

  1. 首先,您使用模块。模块无法实例化(只有一个类),但您的代码使用@instance个变量(这是一种矛盾)。

  2. 您将初始化代码放在Module上下文中,该上下文在解析Ruby代码时评估,而不是在执行时评估。

  3. 最简单的解决方案是更改要在方法中评估的代码。

    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开发人员,但错误似乎很清楚。 @connnilNULL),当然您无法访问任何方法。您应该在使用之前检查@conn。可能这里有一些错误:

@conn = Faraday.new(:url => 'https://api.digitalocean.com', :ssl => {:verify => false})

因为它什么都没有返回

答案 2 :(得分:0)

您在drops_tall方法中的@conn和@token与第5行和第7行中的@token和@return不同。

drops,@ drops中的@conn和@token是实例变量,它们包含绑定到DropletsHelper实例的值(更准确地说,包含DropletsHelper的类的实例)。

第5行和第7行的

@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