导轨5:尝试将API调用结果放入空数组不确定的方法错误中



我正在尝试测试我正在构建的一些服务,但是当我尝试调用我创建的poll_for_events方法时,我遇到了一个未固定的方法错误。

# services/event.rb
class Meetup::Event #< Meetup::Collector
  def initialize
    @client = MeetupApi.new
    @retries           = 25
    @payload           = []
    @search_params    = {
      city: 'Branson',
      state: 'MO',
      country: 'US',
      status: 'upcoming',
      format: 'json'
    }
  end
  attr_reader :client, :retries, :payload, :search_params
  def poll_for_events
    self.payload = client.open_events(search_params)
  end
end

终端输出:

irb(main):001:0> @foo = Meetup::Event.new
=> #<Meetup::Event:0x0055f962497cb0 @client=#<MeetupApi:0x0055f962497c88>, @retries=25, @payload=[], @search_params={:city=>"Portland", :state=>"OR", :country=>"US", :status=>"upcoming", :format=>"json"}>
irb(main):002:0> @foo.poll_for_events
NoMethodError: undefined method `payload=' for #<Meetup::Event:0x0055f962497cb0>
  from /gathrly/app/services/meetup/event.rb:19:in `poll_for_events'
  from (irb):2
  from /usr/local/bundle/gems/railties-5.0.0.1/lib/rails/commands/console.rb:65:in `start'
  from /usr/local/bundle/gems/railties-5.0.0.1/lib/rails/commands/console_helper.rb:9:in `start'
  from /usr/local/bundle/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:78:in `console'
  from /usr/local/bundle/gems/railties-5.0.0.1/lib/rails/commands/commands_tasks.rb:49:in `run_command!'
  from /usr/local/bundle/gems/railties-5.0.0.1/lib/rails/commands.rb:18:in `<top (required)>'
  from bin/rails:4:in `require'
  from bin/rails:4:in `<main>'
irb(main):003:0>
However, if I throw a binding pry and try and call part of the method it seems to work:
irb(main):001:0> @foo = Meetup::Event.new
=> #<Meetup::Event:0x00563f43785b30 @client=#<MeetupApi:0x00563f43785b08>, @retries=25, @payload=[], @search_params={:city=>"Portland", :state=>"OR", :country=>"US", :status=>"upcoming", :format=>"json"}>
irb(main):002:0> @foo.poll_for_events
From: /gathrly/app/services/meetup/event.rb @ line 18 Meetup::Event#poll_for_events:
    17: def poll_for_events
 => 18:   binding.pry
    19:   self.payload = client.open_events(search_params)
    20: end
[1] pry(#<Meetup::Event>)> client.open_events(search_params)
  => {"results"=>
    [{"utc_offset"=>-25200000,
      "venue"=>
       {"country"=>"us",
        "localized_country_name"=>"USA",
        etc... etc...

我只是不知道为什么我不能将这些结果放入空的payload数组中。

当前您正在使用attr_accessor。这本质上是为您编写Get方法:

def payload
    return @payload
end

如果要设置方法,则应使用attr_accessor代替attr_reader或添加:

def payload=(value)
    @payload = value
end

attr_reader :payload仅定义读取但不定义setter。

要设置此变量,您有几个选项:

  1. 将您的代码更改为attr_accessor :payload创建Getter和Setter方法(首选IMHO(
  2. 通过调用@payload = ...而不是self.payload = ...
  3. 直接设置实例变量,而无需设置器
  4. 或自己定义一个设置器方法

因为您提到要将结果放入现有数组中,因此值得注意的是,payload =将覆盖现有数组。为了将响应添加到该数组中,您可以将方法更改为(注意将给定对象推入payload数组的<<(:

def poll_for_events
  self.payload << client.open_events(search_params)
end

self.payload=方法从未定义。相反,您可以这样做

def poll_for_events
  @payload = client.open_events(search_params)
end

或定义该方法为@tibsar建议。

最新更新