I was experiencing some odd behaviour with my app so I decided to make
a simple test to iron it out; I found that it is utterly impossible
for there to be a model in the top namespace by the same name as
another model in another different namespace.
Now, I know modules and namespaces aren't something the Rails Core
puts way up there on the list of priorities, or even if it is on the
list, or any other list, at all, but it would be nice to know if
namespaced models at all is something the Core _wants_ to work in
Rails, or not.
So, if you please.. models in namespaces/models; I know you guys don't
use them much but some of us do, are they Teh Unwanted?
Very best regards,
Tomas Jogin, devoted Rails developer and fan
PS.
My test to prove this problem, if anyone is interested:
1. create a new rails app.
2. generate a model called "Whatever"
3. generate a model called "Other::Whatever"
4. run script/console, type: Whatever and find that you get:
"NameError: uninitialized constant Whatever"
5. type Other::Whatever and find that it works.
6. Delete Other::Whatever, run script/console again, and find that now
the Whatever model magically exists again; it would seem loading
Other::Whatever unloads Whatever, or prevents it from loading, or
something.
7. Please note that Other::Whatever and YetAnother::Whatever plays
nice together, but not with Whatever.
My test to prove this problem, if anyone is interested:
1. create a new rails app.
2. generate a model called "Whatever"
3. generate a model called "Other::Whatever"
4. run script/console, type: Whatever and find that you get:
"NameError: uninitialized constant Whatever"
5. type Other::Whatever and find that it works.
6. Delete Other::Whatever, run script/console again, and find that now
the Whatever model magically exists again; it would seem loading
Other::Whatever unloads Whatever, or prevents it from loading, or
something.
7. Please note that Other::Whatever and YetAnother::Whatever plays
nice together, but not with Whatever.
This is definitely a bug, create a ticket at dev.rubyonrails.org and
perhaps it can be fixed for 1.2, with trunk I see the following:
Whatever
LoadError: Expected
script/../config/../config/../app/models/other/whatever.rb to define
Whatever
from ./script/../config/../config/../vendor/rails/activerecord/lib/../../activesupport/lib/active_support/dependencies.rb:226:in
`load_missing_constant'
from ./script/../config/../config/../vendor/rails/activerecord/lib/../../activesupport/lib/active_support/dependencies.rb:321:in
`const_missing'
from ./script/../config/../config/../vendor/rails/activerecord/lib/../../activesupport/lib/active_support/dependencies.rb:328:in
`const_missing'
from (irb):1
Modules are a very useful tool for organising and namespacing your code. This can be crucial on a large application. Simply saying "don't use modules" because the loading of code in modules is broken isn't really useful advice.
Thanks, but, really, that's not advice at all. Advice would be to
offer a different solution to contextual and/or same-named
identifiers, compartmentalized features, functionality and so forth --
the very problem that the use of namespaces solves.
Furthermore, namespaces, unlike the goto-statement and similar things
you "shouldn't do" in programming, aren't thought of as "harmful"
practices in general. It's just within Rails that namespaces are
frowned upon, and, IMHO, for no good reason (the only semi-logical
reason I can find is: "we can't seem to get 'em right"). Note that I'm
NOT casting any blame here, nor expecting any favors or service; I'm
just rejecting the IMHO baseless proposition to "not use" modules in
favor of, well... in favor of nothing else.
Namespaces aren't evil, not at all. There is absolutely nothing wrong
with using namespaces in general. It's too bad that they just don't
work very well in Rails (but much better now than previously, of
course).
Rails itself is heavily namespaced, so it should be wrong to discourage namespaces in user apps. Whatever and Other::Whatever are a great feature of Ruby and shouldn’t kill each other in Rails.
It's just within Rails that namespaces are
frowned upon, and, IMHO, for no good reason (the only semi-logical
reason I can find is: "we can't seem to get 'em right"). Note that I'm
NOT casting any blame here, nor expecting any favors or service; I'm
just rejecting the IMHO baseless proposition to "not use" modules in
favor of, well... in favor of nothing else.
Who says its frowned upon? Michael (core) says that the original report
sounds like a bug and asks for a ticket. Thjis (user/contributor) says
that he has had problems with modules in the past and are now avoiding
them. Neither represent a "Modules Considered Harmful" argument.
The notion that "we can't seem to get 'em right" does bug me, though.
It's another sign of vendoritis and certainly an implicit form of
blame. The simple fact is that most core developers just don't need
modules, so they are not being worked on unless quality bug reports
come in. And even then, they're probably just going to be fixed to the
best of that report.
Instead, it'd be great if people who actually needs/wants modules in
their applications got a "Friends of Modules" group together, pulled up
their sleeves, and started programming to make them solid. This is a
commons and we're eager to see your contributions in the core. I see no
good reason why modules shouldn't work perfectly, except that "the
people who care haven't done the work".
I'm not saying anything is evil or harmful at all. I've been bitten by module namespace issues in the past and trust me, it's a pain to debug. I'm just telling you from experience that you might want to consider not using modules if you don't absolutely have to.
That _is_ advice in my opinion.
If you really need modules and you have the time, why not fix the module namespace issue and submit a patch? I'm sure you'll get this accepted in no time.
Just wanted to clarify that I'm certainly not expecting any kind of
vendor-like treatment, by "we" (as in "we can't seem to get 'em
right") I meant the Rails community as a whole, not the core or
anything like that; and further, that this was not an assignment of
blame, but a rather poor excuse to stay away from namespaces. (As if
anyone would avoid use of unicode or i18n just because it's lacking a
bit in the implementation?)
I have gotten the impression that namespaced controllers and models
are kind of frowned upon within the Rails community as a whole, I
guess I projected some of that impression onto Thjis comment.
I'd love to fix the namespace issues myself, but sadly my Ruby-fu
isn't quite up for that kind of challenge. Ruby is a very powerful
language, but that power translates into magic which in turn
translates into confusion. Well, to me it does, at least, and
certainly when it comes to dabbling with other people's code. Guess it
wouldn't hurt to take a look though.