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:
parent
d7aa63b247
commit
387878f39c
|
@ -20,8 +20,10 @@ module Draper
|
||||||
RequestStore.store[:current_controller]
|
RequestStore.store[:current_controller]
|
||||||
end
|
end
|
||||||
|
|
||||||
# Sets the current controller.
|
# Sets the current controller. Clears view context when we are setting
|
||||||
|
# different controller.
|
||||||
def self.controller=(controller)
|
def self.controller=(controller)
|
||||||
|
clear! if RequestStore.store[:current_controller] != controller
|
||||||
RequestStore.store[:current_controller] = controller
|
RequestStore.store[:current_controller] = controller
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,34 @@ module Draper
|
||||||
ViewContext.controller = :stored_controller
|
ViewContext.controller = :stored_controller
|
||||||
expect(store[:current_controller]).to be :stored_controller
|
expect(store[:current_controller]).to be :stored_controller
|
||||||
end
|
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
|
end
|
||||||
|
|
||||||
describe ".current" do
|
describe ".current" do
|
||||||
|
|
Loading…
Reference in New Issue