Specifically, when creating a perspective for a plain old ruby object, it invokes .base_class on the class of the first collection member.
Additionally, for namespaced classes, the default has an unexpected value when used to construct the Perspectives for the Collection. In many cases the behavior is counterintuitive and can result in an ArgumentError being raised by asset_valid_params!.
For instance given these classes and perspectives:
module Foo
class FooClass
def bazes
[
Foo::Bar::Baz.new,
Foo::Bar::Baz.new
]
end
end
module Bar
class Baz
...
end
end
end
# Foo Perspective
module Foo
module FooClasses
class Show
param :foo
nested_collection '/foo/bar/baz/show',
collection: proc { foo.bazes },
property: :bazes
end
end
end
# Baz Perspective
module Foo
module Bar
module Baz
class Show
param :baz
....
end
end
end
end
Trying to render the foo/foo_classes/show perspective will raise an ArgumentError because it does not instantiate the baz show perspective with a :baz param. The default param key in this case is :foo::bar::baz.
It seems more advantageous to default to the demodulized class name, and to only use the base_class method if it is available so that nested collections can be used with POROs.
I've created a fix that does this in my fork of the project. When you have a chance can you take a look, and add your thoughts about what this behavior should be.
Specifically, when creating a perspective for a plain old ruby object, it invokes
.base_class
on the class of the first collection member.Additionally, for namespaced classes, the default has an unexpected value when used to construct the Perspectives for the Collection. In many cases the behavior is counterintuitive and can result in an
ArgumentError
being raised byasset_valid_params!
.For instance given these classes and perspectives:
Trying to render the foo/foo_classes/show perspective will raise an
ArgumentError
because it does not instantiate the baz show perspective with a:baz
param. The default param key in this case is:foo::bar::baz
.It seems more advantageous to default to the demodulized class name, and to only use the
base_class
method if it is available so that nested collections can be used with POROs.I've created a fix that does this in my fork of the project. When you have a chance can you take a look, and add your thoughts about what this behavior should be.
Thanks!