Clean view context when controller changes (#799)

When we reassign controller it is the right thing to do to clear current
view context stored in request store. Consider a case when view context
was built before the request was made (usage of `h` helper in class level
context). View context is built from default controller and has no
information about the request. During first request
`Draper::ViewContext.current.controller` will be different than
`Draper::ViewContext.controller`.
This commit is contained in:
Bartek Bułat 2017-05-08 16:23:13 +02:00 committed by Cliff Braton
parent d7aa63b247
commit 387878f39c
2 changed files with 31 additions and 1 deletions

View File

@ -20,8 +20,10 @@ module Draper
RequestStore.store[:current_controller]
end
# Sets the current controller.
# Sets the current controller. Clears view context when we are setting
# different controller.
def self.controller=(controller)
clear! if RequestStore.store[:current_controller] != controller
RequestStore.store[:current_controller] = controller
end

View File

@ -32,6 +32,34 @@ module Draper
ViewContext.controller = :stored_controller
expect(store[:current_controller]).to be :stored_controller
end
it "cleans context when controller changes" do
store = {
current_controller: :stored_controller,
current_view_context: :stored_view_context
}
allow(RequestStore).to receive_messages store: store
ViewContext.controller = :other_stored_controller
expect(store).to include(current_controller: :other_stored_controller)
expect(store).not_to include(:current_view_context)
end
it "doesn't clean context when controller is the same" do
store = {
current_controller: :stored_controller,
current_view_context: :stored_view_context
}
allow(RequestStore).to receive_messages store: store
ViewContext.controller = :stored_controller
expect(store).to include(current_controller: :stored_controller)
expect(store).to include(current_view_context: :stored_view_context)
end
end
describe ".current" do