我正在尝试测试我正在构建的一些服务,但是当我尝试调用我创建的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。
要设置此变量,您有几个选项:
- 将您的代码更改为
attr_accessor :payload
创建Getter和Setter方法(首选IMHO( - 通过调用
@payload = ...
而不是self.payload = ...
直接设置实例变量,而无需设置器 - 或自己定义一个设置器方法
因为您提到要将结果放入现有数组中,因此值得注意的是,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建议。