Skip to content

Commit 1a7bac5

Browse files
committed
Singletons: Fix broken reload method
Prior to this commit, singleton resources were unable to invoke `reload` to re-fetch themselves and load new data. To resolve that issue, this commit introduces a protected `Base#find_self` method that can be overridden by the `Singleton#find_self` version.
1 parent bdb7f20 commit 1a7bac5

File tree

4 files changed

+61
-10
lines changed

4 files changed

+61
-10
lines changed

lib/active_resource/base.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1548,7 +1548,7 @@ def encode(options = {})
15481548
# my_branch.name # => "Wilson Road"
15491549
def reload
15501550
run_callbacks :reload do
1551-
self.load(self.class.find(to_param, params: @prefix_options).attributes, false, true)
1551+
self.load(find_self.attributes, false, true)
15521552
end
15531553
end
15541554

@@ -1698,6 +1698,10 @@ def connection(refresh = false)
16981698
self.class.connection(refresh)
16991699
end
17001700

1701+
def find_self
1702+
self.class.find(to_param, params: @prefix_options)
1703+
end
1704+
17011705
# Update the resource on the remote service.
17021706
def _update
17031707
run_callbacks :update do

lib/active_resource/singleton.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,10 @@ def destroy
121121

122122

123123
protected
124+
def find_self
125+
self.class.find(@prefix_options)
126+
end
127+
124128
# Update the resource on the remote service
125129
def _update
126130
connection.put(singleton_path(prefix_options), encode, self.class.headers).tap do |response|

test/cases/callbacks_test.rb

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@
22

33
require "abstract_unit"
44
require "active_support/core_ext/hash/conversions"
5+
require "fixtures/weather"
56

6-
class Developer < ActiveResource::Base
7-
self.site = "http://37s.sunrise.i:3000"
7+
module CallbackHistory
8+
extend ActiveSupport::Concern
89

9-
class << self
10+
class_methods do
1011
def callback_string(callback_method)
1112
"history << [#{callback_method.to_sym.inspect}, :string]"
1213
end
@@ -31,28 +32,41 @@ def callback_object(callback_method)
3132
end
3233
end
3334

34-
ActiveResource::Callbacks::CALLBACKS.each do |callback_method|
35-
next if callback_method.to_s =~ /^around_/
36-
define_callback_method(callback_method)
37-
send(callback_method, callback_proc(callback_method))
38-
send(callback_method, callback_object(callback_method))
39-
send(callback_method) { |model| model.history << [ callback_method, :block ] }
35+
included do
36+
ActiveResource::Callbacks::CALLBACKS.each do |callback_method|
37+
next if callback_method.to_s =~ /^around_/
38+
define_callback_method(callback_method)
39+
send(callback_method, callback_proc(callback_method))
40+
send(callback_method, callback_object(callback_method))
41+
send(callback_method) { |model| model.history << [ callback_method, :block ] }
42+
end
4043
end
4144

4245
def history
4346
@history ||= []
4447
end
4548
end
4649

50+
class Developer < ActiveResource::Base
51+
self.site = "http://37s.sunrise.i:3000"
52+
53+
include CallbackHistory
54+
end
55+
56+
Weather.include CallbackHistory
57+
4758
class CallbacksTest < ActiveSupport::TestCase
4859
def setup
4960
@developer_attrs = { id: 1, name: "Guillermo", salary: 100_000 }
5061
@developer = { "developer" => @developer_attrs }.to_json
62+
@weather_attrs = { status: "Sunny", temperature: 67 }
63+
@weather = { "weather" => @weather_attrs }.to_json
5164
ActiveResource::HttpMock.respond_to do |mock|
5265
mock.post "/developers.json", {}, @developer, 201, "Location" => "/developers/1.json"
5366
mock.get "/developers/1.json", {}, @developer
5467
mock.put "/developers/1.json", {}, nil, 204
5568
mock.delete "/developers/1.json", {}, nil, 200
69+
mock.get "/weather.json", {}, @weather
5670
end
5771
end
5872

@@ -116,6 +130,21 @@ def test_reload
116130
], developer.history
117131
end
118132

133+
def test_reload_singleton
134+
weather = Weather.find
135+
weather.reload
136+
assert_equal [
137+
[ :before_reload, :method ],
138+
[ :before_reload, :proc ],
139+
[ :before_reload, :object ],
140+
[ :before_reload, :block ],
141+
[ :after_reload, :method ],
142+
[ :after_reload, :proc ],
143+
[ :after_reload, :object ],
144+
[ :after_reload, :block ]
145+
], weather.history
146+
end
147+
119148
def test_update
120149
developer = Developer.find(1)
121150
developer.save

test/singleton_test.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,18 @@ def test_update
143143
weather.status = "Rainy"
144144
weather.save
145145
end
146+
147+
def test_reload
148+
setup_weather
149+
150+
# First Create the Weather
151+
weather = Weather.create!(status: "Sunny", temperature: 67)
152+
153+
# Then reload it
154+
weather.reload
155+
156+
request = ActiveResource::HttpMock.requests.last
157+
assert_equal :get, request.method
158+
assert_equal "/weather.json", request.path
159+
end
146160
end

0 commit comments

Comments
 (0)