With extlib's class_inheritable_accessor, the behaviour of filters is
a bit under-defined when using inheritance, owed to the fact that
those accessors are defined when the attributes are first referenced.
This is an issue when switching to ActiveSupport, and needs to be
specified properly.
The current situation with specs that will hit git master Soon™ is:
# File: spec/public/abstract_controller/filter_spec.rb
it "should not propagate filter changes to child classes" do
# Caveat!
dispatch_should_make_body("FilterChild3a", "Before
Index", :limited)
AbstractControllers::FilterChild3.before :postfact_filter
dispatch_should_make_body("FilterChild3", "Rewritten
Index", :limited)
dispatch_should_make_body("FilterChild3a", "Before
Index", :limited)
end
it "should not propagate filter changes to parent classes" do
AbstractControllers::FilterChild3a.before :inherited_postfact_filter
dispatch_should_make_body("FilterChild3", "Rewritten
Index", :limited)
dispatch_should_make_body("FilterChild3a", "Modified
Index", :limited)
end
Note the "precondition", i.e., the first dispatch_should_make_body in
the first spec. That initialises the accessor and "blocks" propagation
so the spec passes. Without that test, the chain will only be set up
after the base class gets the filter, and thus the child will inherit.
This situation is not quite good, and it's the same for the template
root.
So, the question is: how should inheritance be handled. Two
possibilities are:
(1) Inherit at class definition time, or
(2) Always walk "up" the class hierarchy's filter chains
So, assuming #filter_x appends "X" to the output:
class Base < Merb::AbstractController
before :filter_x
end
class A < Base
before :filter_a
end
class B < A
before :filter_b
end
A.before :filter_y
the result of a filtered action in B would be:
(1) "BAX"
(2) "BYAX"
Which one do you want? :-)
--
You received this message because you are subscribed to the Google Groups
"merb" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected].
For more options, visit this group at http://groups.google.com/group/merb?hl=en.