Ruby on Rails 2.0 is Done 385
Jamie noted that ruby on rails 2.0 is done. In addition to upgrade and installation instructions, the article lists a number of the more interesting new features in the release which appears to be quite extensive.
ORM still broken? (Score:5, Informative)
RRN? (Score:5, Insightful)
Re: (Score:2, Funny)
Re:ORM still broken? (Score:5, Insightful)
I don't even consider normalization taken to the extreme, to be a good thing. It's a trade off, just like everything else - what you gain by normalization, you might lose in the form of added application complexity, or perhaps even something else. Just because normalization is "good" according to ivory-tower database theory, doesn't mean that anything that isn't fully normalized is "bad" or "broken".
"Yes I know that a serial/autoincrementing key makes it easy for the app... it makes it a lot harder for the DBA in a lot of cases."
Can you explain what exactly it is that makes it a lot harder? (And isn't a DBA paid to do his job?)
Re: (Score:2)
Re:ORM still broken? (Score:5, Insightful)
If you really, really, really, really need composite primary keys, you can still fallback to raw SQL queries in Rails.
Re: (Score:2)
Re: (Score:2)
So one one side, we have J2EE (and similar frameworks), which is "enterprisey", flexible-until-your-head-pops-off, can-be-used-for-anything, etc etc. The downside of all that flex
Re: (Score:3, Insightful)
While theoretically you are correct, it doesn't apply to 99% of the web applications. Most web applications are very CRUD-like and deal with small to moderate amount of data. Most software on this planet is written to be used internally by an organization. Not everybody is building the next MySpace or the next Google search engine.
Some software on this planet might be very CRUD-like. In my experience, all web aplications, specially those for internal use, are CRUD apps with a twist. I haven't seen any CRUD-like app that I could solve in a straightforward way. In general, that twist takes longer to implement than the CRUD part does. In fact, it takes longer to define accurately. Development time is important, but not even that important. The strength of using JEE, or any other big, flexible technology, is that you can define (or get
Re: (Score:3, Interesting)
I don't know what you've been reading, but that was my point all along!
And there is nothing wrong with that. Most of the web apps that I make are CRUD-like. I'd still rather choose RoR for its productivity boost over your theoretically-better-a
Re:ORM still broken? (Score:5, Interesting)
Re: (Score:2)
Re: (Score:3, Interesting)
Here's the simple, easy-to-comprehend reason why surrogate keys should not be used universally: Your logical model should exactly correspond to the client's conceptual model.
If the client says that "orders have order items, numbered 1,2,3,4..." then your model should have (ORDER#, LINE#) as t
Re: (Score:2)
You can't say that will be the case 100% of the time. Most of the times denormalisation is chosen to improve the performance. In which case its faster to be denormailized, even with constraints. There are many different variables that come in to play when discussing database design that can't be accoun
Re: (Score:3, Insightful)
Yes, my database theory knowledge is limited. I admit it. I passed the 'database systems' course, but I'm not a professor in database systems, so *of course* my database theory knowledge is limited. That's why DBAs exist and why they are paid to do their job in the first place.
But you know what, the database isn't the only thing that exists. There's also the actual application. If, by
Re: (Score:2)
The thing a lot of OSS developers seem to forget is that many applications are primarily for data processing with user interfaces thrown on top. I.e. Not every damn "web app" is a blog or wiki, where it's primary purpose is to be a web app.
Fact is that, if Rails wants greater acceptance (and, yes, I realize it is already widely accepted -- I'm talking about continued growth), then it's going to need to support things like composite keys. Why?
Re:ORM still broken? (Score:4, Insightful)
If you're referring to DHH, then no, I'm not him. My stance isn't as extreme as his ("database is just a big hash") but I do agree with some of his points. Transactions = good. Foreign key constraints = good. Stored procedures = only use when absolutely necessary. Normalization = weight between pros and cons in application code complexity and data redundancies. Etc.
"The thing a lot of OSS developers seem to forget is that many applications are primarily for data processing with user interfaces thrown on top. I.e. Not every damn "web app" is a blog or wiki, where it's primary purpose is to be a web app."
Not every, but *a lot* of them are. Very often they're systems for displaying, storing and retrieving small to moderate amount of information (unless you're working on a really really big multi-million system).
"Fact is that, if Rails wants greater acceptance (and, yes, I realize it is already widely accepted -- I'm talking about continued growth), then it's going to need to support things like composite keys. Why? Because people use them, and the application may have come years before the web interface."
I don't think so. I'm pretty sure that people complain about composite primary keys because it's so easy to complain about. Most of them probably wouldn't consider using Rails even if it fixes all its "flaws". *
There was a time when I took all Internet complaints very seriously. I worked very, very, very hard to meet peoples' demand, and I did it for free. In the end, it didn't help. Whenever I publish a fix for one complaint, they complain about other things. It's an endless cycle. The complainers can never be satisfied no matter what I do.
For example, people complain about memory usage in Rails. I've developed a way to reduce the memory usage by 30% [plan99.net], and look - very few people are interested! The people interested in my work are extremely disproportional to the number of people complaining.
* But by fixing Rails "flaws", you've just made it worse. The reason why Rails is so great in the first place is because it's a very specialized framework. It's not trying to be the thing for everything, like J2EE. If you make it the thing for everything it'll be a lot more painful to work with. It's like saying that your television can't wash your clothes. While it's possible to make a television that does that, it would be a royal pain to make and to work with.
Re: (Score:2)
Have you ever worked on a properly normalized database schema? I have, and it is a dream. When your database is designed correctly, you can mine it for pretty much any kind of information that you dream of.
As a bonus, a properly normalized database is self documenting. Presented with nothing more than a database schema drawn on a white board, you should be able to deduce how a business works to a fairly detailed level without ever readin
Re: (Score:3, Insightful)
Re: (Score:2)
(At least until you bring on a specific normal form)
We know nothing about the data space itself, or the constraints in which it will live, and no key info was specified, so we can't even intelligently determ
Re: (Score:2)
Well, it certainly is clear that your "data theory knowledge is limited". What does "normalizing to the extreme" mean? There are 5 (or 6, if dealing with temporal data) widely recognized normal forms, each with a very formal definition.
Most well-designed databases are already in 5NF. If a relation is in 3NF, it's probably also in 5NF, unless you are dealing with multi-valued or cyclic dependencies, something that occurs ra
Re: (Score:2)
Pretty simple concept, but completely lost on programmers who think the database is the "backing store" for their code (which will likely be replaced or rewritten in few year anyway, especially stuff like PHP, Ruby, etc). No, the database is the foundation of the business. It should be properly designed.
You're generalizing from your specific situation. Often the goal is to sell the company in a few years to another company that will require you to integrate with their databases in any case. In that case
Re:ORM still broken? (Score:5, Insightful)
Borrowing from your SSN example, let's say that your client tells you the main way they identify customers is through the SSN, and you go by that, and then there's a case of identity theft and the customer's SSN number has to be changed? Now you've got potentially thousands of records with a bad primary key that you have to change (and mitigate constraint issues as well). What if privacy issues require the company dropping SSN's as an identifier, and now the company will be forbidden from asking customers their SSN's? You'll no longer be able to generate primary keys compatible with the same ones used before.
What truly separates a good DBA from a bad one is the good DBA's ability to anticipate change, design for change, insulate existing stuff from change, and basically save the client from any flaws in their own conceptual model (while making it look like they've followed the client's conceptual model to the letter). A bad DBA simply trusts whatever his client says and believes it to be correct and forever immutable.
Re:ORM still broken? (Score:5, Insightful)
You are completely incorrect.
If your domain model describes the way an actor finds an entry is by Order# and Line#, that should in no way, shape, or form decree what your technical artifacts look like.
The correct thing to do in that case is to have a unique, opaque, identity key (numeric or guid, just so long as its unrelated to the record data, and has no additional meaning beyond the unique value of that record).
Then you can also add unique constraints or indexes to the composite key, and/or you can enforce that unique constraint in the application. Or both, for the smart ones.
But you need to have a unique way to identify the record THAT IS NOT SUBJECT TO CHANGE. In your example, you could re-order the lines, or one line could have been a mistake and you need to move it to a different order.
If you've used composite keys on order# and line#, then you've got alot of cleanup work to do after your change.
If you've used proper opaque identity keys, then you just change the data, and there are no side effects.
Since in that case your joins are also done on the identity keys, your relatinoships are stable even when you change order# or line#.
The SSN one is even worse. I can guarantee you that if you do that, someone will have the wrong SSN, and it will need to be changed in your data.
If you've used SSN as the primary key, then its a pain in the ass, and you have to do data integrity cleanup.
If you've used a proper opaque identity key, then you just change the SSN, and there are no side effects.
This is stuff you learn the first time you write an app as a junior developer without a mentor, and use SSN as a key. A year or two later you come to regret it, and the lesson is learned for a lifetime.
Re: (Score:2, Insightful)
CREATE TABLE foo (company_name text PRIMARY KEY)
Which as I understand it, Rails is too stupid to understand. Granted, the only ORM that I know of that isn't is the one being used by Catalyst but still. It is a major design mistake to assume that your data can be correctly represented in a normalized structure using (id serial PRIMARY KEY).
I am also not talking about extreme normalization. I am t
Re: (Score:2)
In theory you are true. But I'd like to see some evidence that proofs that lack of support for non-
Re: (Score:2)
Heh. In Rails that would be Monster.find_all_by_name('whatever'). Without creating any methods at all - ActiveRecord 'created' it for you. The guy below mentioning protecting data from programmers - if that's the philosophy you want to use, why not just quit now?
Re:ORM still broken? (Score:5, Insightful)
If you do most of the logic in your stored procedures, it makes it easy to bolt on new features written in various languages. If you decide to have a perl script for a cron job, you just call the same stored procedures your ruby app is calling. If you want a windows front end for your admin staff, the windows app calls the same stored procedure too.
Once you bury the database logic in the application code, you have to rewrite it for every application. It is, in a way, a very evil form of copy & paste programming. Now every change in the database requires you to go into every single application and change something. Kinda like when you get slutty with your code and copy & paste it rather than abstract it out into a library.
And I'm aware stored procedures don't play nice if you are worried about cross-database issues because you sell the software. This only works when you get complete control over the application & database stack.
PS: MySQL stored procedures suck. Use a real database with a better stored procedure language.
Re: (Score:3, Insightful)
That's a good point, but I think you're learning the wrong lesson from it.
Yes, duplicating
Stored prodcedures can improve performance (Score:3, Informative)
I have been at places were the DBAs have found very expensive calls to turn into stored procedures and the net result has
Re: (Score:2)
Re: (Score:2)
has_and_belongs_to_many
and your TaxParcel model would say:
has_and_belongs_to_many
And then you could do @loan.tax_parcels, or TaxParcel.find(:all,
Re: (Score:3, Interesting)
"A tad much"? Either you're being facetious, or you have a profound misunderstanding of normalization.
In many cases, a relation in 3NF is in 5NF. In fact, you have to be somewhat creative to think of a practical example of something in 3NF but not in 5NF.
"Normalization" is highly misunderstood. There is no such thing as "extreme normalization". If you see an example of something in 2NF, and then see a 3NF design side by side, you wou
Re:ORM still broken? (Score:5, Interesting)
Re:ORM still broken? (Score:5, Insightful)
You're assuming that all composite primary keys use values that do change. That's highly unlikely, given the number of tables in the world filled with historical data. That said, I agree (for other reasons) that surrogate keys are much better.
Re: (Score:2)
I don't think this is entirely the best way, but here's ONE way I found by Googling: http://lindsaar.net/2007/11/28/connecting-active-record-to-a-legacy-database-with-stored-procedures [lindsaar.net]
I know I've seen tips and tricks for PostgreSQL before, but I'm having trouble locating them at the moment. D'oh!
It's even covered in the Pragmatic Programmers' book on Rails. My copy is in a
Re: (Score:2)
Re: (Score:2)
So yes, I agree with not forcing auto-incrementing fields.
Re:ORM still broken? (Score:5, Funny)
What a relief... As a lisper and rubyist, I'm glad to hear that Python is going to die! Good riddance!
Re: (Score:2)
Re: (Score:2)
Oh wait, that wasn't my mistake, that was yours. I wonder if they will find the gene that makes people repeat other people mistakes.
Re:You don't have to use ActiveRecord (Score:5, Insightful)
Re:You don't have to use ActiveRecord (Score:5, Funny)
Re: (Score:3, Insightful)
Re: (Score:3, Informative)
Go for it - I've done it more than once when I needed to get data out of legacy(and very poorly designed) databases. Rails supports this and it works just fine. The one point you make that I really agree with you on is ActiveRecord's inability to detect changed attributes and save o
Re: (Score:2)
"all facts for a single entity in one table"
Just break the entity up into composite parts that map to separate tables/model classes, each of which "belongs to" to the master object. There are other ways to do it too, if you want to write some code.
"using one-to-one links ("universal IDs")"
I don't know what you're talking about. I don't think these are industry terms. If you're referring to "surrogate keys", there are perfectly valid reasons
Fresh Meat! (Score:2, Interesting)
If you desire a secure system, do not place a large, immature body of code in the line of fire on the internet.
Re: (Score:2)
The two properties I warned against were 'large' and 'immature'. I mentioned neither 'open' nor 'closed'.
Thankyou for educating me. I'll file it with all th
I don't understand the fuss. (Score:5, Interesting)
Re:I don't understand the fuss. (Score:5, Insightful)
Re: (Score:2)
Re: (Score:2)
Re: (Score:3, Informative)
Re: (Score:2)
First of all, ASP.NET is almost Windows-only. Mono support is not ready for prime time. This would mean I'd have to use Windows for development work, and it'd significantly lower my productivity. For a while, I installed Visual Studio and played around with ASP.NET. I borrowed an ASP.NET book. But I didn't like the experience at all. Everything is tied to the IDE. I have reasonable C# experience and I quite like the language, but ASP.NET doesn't a
Re:I don't understand the fuss. (Score:4, Interesting)
Uhm no I don't. I've programmed in Perl far longer than I've programmed in Ruby. I only started with Ruby about 2 years ago. I have experience with mod_perl and stuff like Template Toolkit. I have experience with Python. And Ruby on Rails *still* beats everything else I've used.
It isn't just Ruby, it's also Rails. It's the entire package. Rails is not just any framework, it's an entire design philosophy. It's opinionated software. It's Don't-Repeat-Yourself. It's REST. It's convention-over-configuration. All this stuff together makes me much, much more productive. Ruby on Rails actually makes web application programming more fun than desktop application programming.
Re: (Score:2)
To me the important features of Rails are:
- Convention over configuration. Follow some simple naming conventions and your class to table mappings come practically free.
- Very
Re: (Score:2)
Re:I don't understand the fuss. (Score:5, Interesting)
Re: (Score:3, Informative)
Re: (Score:2)
Re:I don't understand the fuss. (Score:5, Insightful)
Some things to read about and try within Rails:
* ActiveRecord's ability to introspect the DB schema at runtime. e.g. autocreating the method to allow: User.find_by_name('Joe')
* ActiveRecord's magic-fields, e.g. created_at/updated_at
* the ActiveRecord associations, and the easy DB queries that come with them, e.g. @user.posts.find(:all,
* the scope_out plugin, which provides some nice additions to 'with_scope'. e.g. in the Post model you could do scope_out
@user.posts.pending
* ActiveRecord callbacks and the controller before/after filters
* the RESTful routing and easy links that come with it, e.g. link_to(@user.name, @user) will create a hyperlink to the correct URL for that user record's 'show' page
* the form/field helpers which also integrate with the routing, so you can now do just form_for(@user) - it will create a proper form tag for hitting either the create or update method for that @user, depending on whether the record has already been saved to the database - the form_for/fields_for block syntax is also very powerful, especially when you add your own form helper methods
* all the convenience methods provided by active_support, like 5.minutes or 1.month.ago
* Ruby itself - Ruby is simply a joy to code in. even if I were going to dump Rails, I would now strongly prefer to find a new Ruby framework(like Merb) than using another language
I'd strongly urge you to pick one or more of the PHP MVC frameworks to look at while you read about Rails. Most of them are copies or at least inspired off Rails to some degree, so they often use similar conventions. You'll see the difference between what's possible in PHP and Ruby - PHP doesn't come out looking too good at the end
Re: (Score:2)
Parenthesis in function calls are optional! That's not what I would call "clarity".
My impression after using RoR for a few months is that "what seems logical" to Ruby's creator is not what seems logical to me.
Re: (Score:2)
It's new tech for people who weren't aware of... (Score:3, Informative)
There's nothing special about RoR, no. But compared to tools like PHP, it's a godsend.
Sites Moved to Rails? (Score:5, Interesting)
Comment removed (Score:5, Interesting)
Re:Sites Moved to Rails? (Score:4, Funny)
How many did the system respond to?
Re: (Score:3, Funny)
If throwing random crap to the script causes that, then yes, you have a serious problem.
Science (Score:3, Interesting)
I guess they didn't fix the scalability issues (Score:5, Funny)
Otherwise, one might think that RoR doesn't scale.
Re: (Score:3, Interesting)
Re: (Score:2, Interesting)
That's why I'm curious as to why Django (Python framework) doesn't get more press. It's fast and, unlike Rails, it's been proven to scale (ie washingtonpost.com). The languages have more similarities than differences, so it can't be that. Better marketing/hype, maybe?
I think you hit the nail on its head. Django fricken rocks, in my experience, in both speed and usability.
It just doesn't have the hype engine going for it the way RoR does. It's for this reason that I'm hoping the Perl on Rails thing that the BBC wrote gets some momentum - the MCV/MTV approach is a Good Thing, for web-based development. It's not a change in language, so much as a change in how it's laid out. One must note that CGI::Application (found here [cpan.org]) has existed for Perl for quite some time
Re: (Score:2)
Re: (Score:2)
I am not sure how you intended this to be taken, but if you meant to imply that the differences between all the languages you mentioned are just a matter of taste, I must disagree.
The languages you mentioned differ on features that have a very real impact on productivity, reliability and maintenance.
Re:I guess they didn't fix the scalability issues (Score:4, Interesting)
Enter django. Wow, all the power, none of the "Hansson said this is how it should be, so no other way is possible" handcuffs.
To me django is a much better designed framework, it has in my opinion a much more powerful database abstraction layer, it is more intuitive too. working in Rails for > 4 months I still had to look up the syntax for doing activerecord queries every single time. django's query syntax just makes sense to me, and is much more intuitive. And what can I say, I've never enjoyed making HTML forms more than using the newforms library that builds them for you (oh yeah, and validates them for you, and marshals form input into objects automatically...).
Also, the simplicity of setting up a production django server is so much easier than RoR. Sure, once you start having lots of traffic, building a fully scalable system is probably going to be similar. But to set up a single server for a low traffic site, or a small company intranet, apache+mod_python is great. mod_ruby has huge performance issues, ror+fastcgi in apache is atrocious, mongrel can be ok.. but then you still have to set up apache in front of it, and its not a simple apache set up as you have to configure all the proxy stuff...
Besides the fact that python is ~10 times faster than ruby (just at the interpreter level) and you've got yourself a nice little powerful system with django.
Maybe once django hits version 1.0 they'll get a bit more hype, but I've actually seen more posts on this story saying "check out django" than I've seen people saying they absolutely love rails.
Re: (Score:2)
Does it still require Mongrel? (Score:2, Insightful)
Because, frankly, if it can't be run on apache 2.x, I (and the company I work for) won't touch it. We have already seen the scalability nightmare that RoR was, of course, so obviously we're a bit skeptical about performance optimizations. (:
Note: I have nothing against using new technol
Re: (Score:2)
At this point...JAF (Score:2, Interesting)
Re: (Score:2)
The other one is, "can ruby perform well enough for any reasonably loaded webapp?". So far, most of the answers I've heard amount to "no", or "well, if it gets to that stage, you can always buy a cluster".
The server's... (Score:2)
Scalability (Score:2)
Recently, a friend told me that scalability was a major concern with Rails. I am not aware of any issues with that with the sites I worked on (which are pretty high traffic), but I left the project before the sites went live, so I can't say for sure that there weren't any issues. Can
Re: (Score:2)
It is a pity ... (Score:3, Interesting)
Why the hate? (Score:3, Insightful)
Seriously.. why does Ruby on Rails get so many people so fired up? If you don't like it, don't use it. If you do like it, feel free. There's no one-size-fits-all solution, but for many people Rails comes pretty close. If you're not one of those people, there are plenty of other frameworks and languages.
Why do people in any kind of IT have such huge egos? It's counterproductive and at the end of the day, if you're making the client happy, and that makes your boss happy, you've done your job.
Re: (Score:3, Insightful)
I can't take you seriously when you claim that all Rails developers are "zealots." You wear your bias on your sleeve.
As a Rails developer myself, I know for a fact I'm not out there making "mythical, false claims." When I develop solutions for clients, I sell them just that: solutions. I don't sell them Ruby on Rails solutions. I just sell them solutions. My experience is unless a client has a specific desire to use a particular framework or language (.NET and J2EE are popular requests), they don't r
Re: (Score:3, Insightful)
Rails was borne of a production application: Basecamp. It didn't come into existence because they "hated EVERYONE!" The application had already been built in Ruby, and DHH saw that there was a lot of the system that could be reused. He packaged it up, and released it under the name "Ruby on Rails."
Rails has gotten hyped, no question, but the level of rhetoric leveled against it has gotten to the point where people are unwilling to acknowledge that it is a capable framework. Great marketing only gets y
Re: (Score:2, Interesting)
Scaling matters if you're Digg. Are you Digg? (Score:5, Insightful)
I have a Rails site, my first (hopefully of many) for my small business, which plugs along at about 20 requests a second in tests. If I could saturate those 20 requests a second, I would quit my day job on the spot. Scaling? Eh, who cares.
(P.S. Day job is writing enterprise level crud apps for Japanese universities on the J2EE stack. They worry a bit about, e.g., getting hit with 8k users signing in simultaneously during class registration. You know what we do? Exactly what I'd do for a Rails app in the same situation ("don't do anything stupid like an n+1 queries loop, cache the important stuff, and buy enough hardware for the job"). Only difference in Rails is I have never wanted to poke my eye out with a spoon while writing it.
Re:Scaling matters if you're Digg. Are you Digg? (Score:5, Insightful)
Re: (Score:2)
Re: (Score:3, Insightful)
That said, because of Rails speed, you will wind up needing t
Re: (Score:2)
Re: (Score:2, Funny)
Re:Scaling matters if you're Digg. Are you Digg? (Score:5, Interesting)
The upper limit I see with RoR/FCGI is around 2500 requests per sec, for a 'is the server alive' ping, that simply returns 'Yes'. Typical, results are in the ~100 requests per second range with moderate db access, and rendering to xml or html. 100 requests per second was enough to handle a 24 hour media buy on the frontpage of myspace for example (100,000k unique visitors-ish).
Moving your static assets off of your server and on to S3 or another CDN is obviously a big help here, so your server/bandwidth is only taken up with requests that need/affect the db. From the example above, with the MySpace media buy, the total for that day was $20-30 I believe in bandwidth costs, and this was a site with a video mixer that had tons of images/video/mp3 and large flash objects. Obviously, mongrel shouldn't be delivering your assets locally anyway, apache/lighty etc should be.
Ultimately it comes down to design and caching when it comes to getting that top performance out of it. My 100 requests/sec wasn't using MemCached or fragment caching, and the mysql db was local. Caching in Rails is a little less than helpful for highly customized for each user sites, but there are plugins that extend it like extended_fragment_cache(ing?), that allow you to templatize things like ID's, etc. Think of say a forum topic listing, where only the topics change as you paginate. With extended fragment caching, you basically draw the page once, and then pass in a hash of the variables that replace the placeholders each time you draw a new page.
Another big thing with ajax sites, is to use link_to_remote with the
Re: (Score:2)
There's a more generic saying on this: (Score:3, Insightful)
Which basically means if you've got 200 000 hits a day and your existing setup is folding under the load, you've found a glory hole on the webbernet. And you're likely to find the funding required to scale the site - even if that means moving to an entirely new technology alltogether.
Re: (Score:2)
Re: (Score:2)
Re:Python on Rails... instead.. (Score:4, Informative)
django provides all of the ease of Ruby on Rails, it is powerful, it provides even more tools than Ruby on Rails in my opinion specifically for web work. And I don't feel like I have handcuffs on when I'm developing in it.
I started building 2 projects in Ruby on Rails ~8 months ago. These were existing PHP systems which had become overly cumbersome and were in serious need of a redesign/rewrite. Rails seemed to provide everything I needed, began porting... got about 30% done and started running into serious roadblocks that were there by design in Rails.... I aborted the porting, and started looking for another framework, found django... the 2 projects are now 100% ported (took less than 1 month each).
django was also significantly easier to set up for production than my experiences with rails (apache? lighthttpd? mongrel? the recommended web server for rails changes every week...) modpython+apache is dead simple to set up and rock solid (apache+rails requires fastcgi which was constantly crashing, unstable, and basically doesn't work)
obviously I'll get flamed for this as RoR has way too many fanboys, but as far as a concise, powerful, well documented, easy to use, flexible, and enjoyable development experience nothing gets close to the last 2-3 months working with django.