I really like that the Rails team is pretty good at doing regular releases. One noticeable thing though is that ActiveRecord, almost, always has more fixes than the other Action* gems combined, understandable since its the most complicated piece, but I can't help to think of Ernie Millers ActiveRecord talk a few years back. https://youtu.be/yuh9COzp5voA
(A few of the things that he talks about are since then fixed..)
Wow, this is a really great talk for anyone using rails. Ernie Miller manages to dissect a few gnarly parts of ActiveRecord while keeping it positive and constructive.
Is Rails relevant today in the world of rich front end frameworks other than for legacy applications? I used to be a big fan of Rails but there is a steep learning curve and looks like there are better alternatives now.
Rails continues to include things that most developers need when building a web application or api.
While most people are arguing about web framework speeds Rails has been putting in features that are useful, like mail previews, strong params, async emailing, Russian doll fragment caching(nice if your still doing traditional templates, can be used with JSON rendering too). The community also has very nice and mature libraries for doing authentication, authorization, audit trail, and uploading.
Use the right tool for the job. If your project is just a REST api then Rails might not be the right choice. If you're writing a complex CMS/CRM,ecommerce site,or anything that has a complex UI from scratch, then rails and ruby's gigantic ecosystem will set you up and running in no time.
But so can Spring,Django or Symfony if you know them from the inside out.
Sure it's still a relevant option. You can integrate the current popular frontend frameworks easily if you want. It provides a relatively painless and speedy development experience.
> and looks like there are better alternatives now.
...such as? It'd help to know what you consider to be "better alternatives" because it gives scope to what your priorities are. I've seen discussions in which people say, "Well now there's Sinatra"...which is fine, but that's more of an opinion about "Lightweight projects and systems are nicer" rather than "Sinatra is better than Rails". I used to use Rails all the time but now I do most data projects in Middleman...but that's because I prioritize static builds and front-end engineering and most importantly, simplified my data infrastructure so that it can be represented as a spreadsheet or plaintext YAML...but that's not something applicable to all projects.
One of the most valuable parts of Rails is its opinionated infrastructure...and I think that's helped it be a little more nimble from version to version.
Better alternatives could be one of NodeJS frameworks, Play in Scala and Dropwizard for Java. They could be better in the sense, that I can share a JS library between the API and Frontend or I can share a JVM library between the API/Infrastructure layer.
So I've been using Rails in production for a few years now, and its pretty good. I'm sure there are better options for a number of specific domains. I also use Dropwizard(because I need to use a few java only libraries) and dropwizard is in no way better than rails, except in the number of requests per second it can handle. It is a pain to set up compared to rails, the docs are terrible, it forces you to use maven and they refuse to help you with gradle. There are very few Stack Overflow answers, and thats a problem, because Dropwizard offers few sensible defaults, its configuration all the way down. And generally, the lack of livereload makes web development a pain in java.
> Dropwizard [...] forces you to use maven and they refuse to help you with gradle
The configuration syntax (YAML) shown in https://dropwizard.github.io/dropwizard/manual/configuration... looks quite nice. It says there you can use JSON instead. The syntax Gradle uses (i.e. Groovy) has a lot of cruft, including even a full programming language, which can be misused in build config files so best steer clear.
Is there a steep learning curve? Admittedly, I haven't had to pick up too many new frameworks, but I would have thought Rails was easier to pick up than many others.
It's not easy at all. I mean, if you are filling in the generated scaffolds, it may be easy. But when your coworkers start using all the nasty routing DSL tricks and the myriad of helpers, it stops being easy. Thing is, it's too big and rich for its own good, and let's not speak of the development practices it encourages.
I just started learning it this week and it isn't bad... However, there's quite a bit of setup, and it's a bit tricky at first.
Basically, a few years ago I thought it was easier to build my own framework in Golang, C, C++. I've also used PHP, Node and Flask from time to time. After doing all that, I had a pretty good understanding in how it all works, and can see the beauty in some of the way Rails works. I definitely think it'll keep growing and is worth learning if you're into web development.
That is the problem with rails. It starts off easy when you are just making CRUDs and as the code grows bigger, you have to know a lot on how the framework works and that's where the learning curve hits you.
It's easy if you stick with vanilla Rails. Where it gets complicated is if your team decides to use a different view language, a decorator gem, a factory framework, and a different testing framework. The more deviations from Rails proper, the higher the learning curve gets.
If a person know Git, HTML, JavaScript, and one server-side language, I can teach them enough Rails to build production apps in a few weeks. I've had a lot of success with that.
no that's bullshit, just do the rails tutorial online and you'll be good to go. OF course you need to know Ruby. Like with any other language, you can't just learn the framework.
Rich front-end frameworks handles exactly that, the front-end. Rails is still an excellent choice for the back-end and serving up those APIs to those "rich front end frameworks."
I've been using Rails since 1.1 or so. It was the first framework I picked up, and the learning curve was steep for me (I didn't even know what a GET was at the time). It is much more involved now. Before there was no bundler, no asset pipeline or compiled assets of any kind. Javascript was an afterthought. There were no real choices to make.
Railscasts was active. This was huge. Repeating for emphasis. Railscasts was huge for me.
There were a few headscratchers along the way - RJS, components, maybe a few other oddities (I think turbolinks falls into this category), but they tend to get removed as time goes on if they don't work for a lot of people. The Rails team may get pretty enthusiastic about some weird stuff now and then, but they're also pretty good about reversing their mistakes. They seemed to have learned from the 2->3 transition hell as well. Upgrades are fairly painless now.
That said, it's still very much relevant. It's been polished to the point where you can really do a lot with very little work. There are solid, well maintained gems that do lots of common tasks (although there are a few things that are strangely missing from the community). The REST convention is very powerful, and the code is easy to follow.
I resisted the move towards complex js front end frameworks because I was tired of figuring out which one to learn. That hasn't changed. I abhor the pace of js framework development - I can't justify learning a lot of it from a business perspective. It is just too unstable. I have clients using Rails apps I wrote 7 years ago that are still very maintainable, and that is great.
When I need complex UI's I take a hybrid approach and have rails load miniature angular apps on a page by page basis. If the view is complex enough, I have it load up a single file angular app to handle that complexity - but only for that page. A 4 line helper loads the angular files automatically. Otherwise, it's all Rails. I've found this approach to be very flexible - it's able of delivering a very rich UI where needed without overcomplicating the good stuff that Rails provides for free.
Even if I were starting over today, I think Rails would be at or near the top of my list. I feel for folks picking it up now, though, as it is a little tougher than it used to be.
I agree with this so much. Would you be willing to share some examples of how you leverage Angular with Rails? I'd really like to see something that does this that isn't a toy. I'll even sign an NDA. I just would like to learn.
I don't really have anything I can show you directly, but here's what I do:
I recreate the view directory structure in the assets folder, but only for views where I need a complex (angular) UI. So I might have a file in assets/javascripts/users/show.js because the users#show view is more complicated than I want to do in rails.
If that asset file exists, I have a helper automatically load it into the head section of the view layout when the users#show action is hit. The helper itself is only a few lines of some obscure rails code that looks up the name of the controller, action, etc and looks up the files in the assets directory. If you match the view directory structure to the assets directory structure, it stays very organized and is all done by convention.
In the show.js file, I will create an entire mini angular app (one file). The show.html.erb view will just contain angular markup (and maybe some erb). It's that simple. If Angular needs some instance variables from rails, I just pass them in to js with a couple lines in a <script> tag at the beginning of the view.
If I need a custom directive, I put the templates for those in public/templates (there may be a better place for these, depending on what you're doing - for my use case, this was fine).
There are some downsides - you have to separately compile each js file. I suppose you could do them all together, but I like keeping them separate. But largely, you can lay angular on top of rails in a very unintrusive manner this way. It probably doesn't work for every situation - you have to keep your angular apps small or it gets complicated again. But it really lets you enhance the UI of a rails app without a lot of technical debt. Code reuse can be a challenge (organizing bits that are shared is kinda wonky), but often the angular apps are small and simple enough that this isn't really a problem. Repeat yourself a little. It won't kill you.
An example of where I've used it is to load a chart and some daily/weekly/monthly selectable data that is sortable by columns, by date, with pagination, search fields, etc. I make the data available via rails as JSON, and just have the angular app pull it all in for the user to manipulate.
Another would be a form that creates a query interface similar to the one used by google analytics to create custom segments.
There may be better ways to do all this, but this approach has served me well. It's a little rough, and I'm sure it could be improved. As always, YMMV.
Good post here. I'm doing similar things with Angular and Rails. For the most part jQuery gets me most of the way. In cases where I need something really complex I just look to Angular 1.x for that one page. It works, it's easy to use(for the most part), and you actually end up writing less javascript then if you tried to do adhoc jQuery stuff.
I'm finding Turbolinks partial replacement a good option in some cases too.
The thing with not doing a traditional SPA in one Javascript framework, is you can rip out or add anything at anytime. So say in the next 30 seconds when a new Javascript framework comes out, I can use that in my Rails app. If I embraced Angular for my entire app it would be impossible to change the framework out. I've been able to play with React, Knockoutjs and others on certain parts of my app because I'm still embracing traditional navigation(with Pjax or Turbolinks)
It's fascinating to watch the changing reception of a given framework. I think this says a lot about how software projects grow old. Since my career is only slightly older than Rails, it's been the framework that I've got to watch the most completely. I recall in 2005 and 2006 there was an intense joy in the tech industry, relating to Rails, and it seemed like Rails was going to sweep the industry. In retrospect, that joy was mostly because Rails offered something simpler than the heavyweight Java frameworks that had dominated the era before. In 2006 there was the big question, "Is it Rails we love, or the ideas in Rails?" That is, did we all need to start using Ruby, or could we copy these ideas in whatever language we preferred? And nowadays we know the answer to that question. In 2005 and 2006 Rails had a huge impact on the industry, but by now its good ideas have been fully absorbed by other tech communities.
For those who want to remember the mood of the times, circa 2005, Bruce Eckel did a great job of capturing it in his December 2005 essay "The departure of the hyper-enthusiasts":
29 comments
[ 3.7 ms ] story [ 79.2 ms ] threadWhile most people are arguing about web framework speeds Rails has been putting in features that are useful, like mail previews, strong params, async emailing, Russian doll fragment caching(nice if your still doing traditional templates, can be used with JSON rendering too). The community also has very nice and mature libraries for doing authentication, authorization, audit trail, and uploading.
Not to mention, testing is in out of the box.
But so can Spring,Django or Symfony if you know them from the inside out.
We're finding it to be incredibly productive, and more than performant for our needs — especially when you couple it with Postgresql.
...such as? It'd help to know what you consider to be "better alternatives" because it gives scope to what your priorities are. I've seen discussions in which people say, "Well now there's Sinatra"...which is fine, but that's more of an opinion about "Lightweight projects and systems are nicer" rather than "Sinatra is better than Rails". I used to use Rails all the time but now I do most data projects in Middleman...but that's because I prioritize static builds and front-end engineering and most importantly, simplified my data infrastructure so that it can be represented as a spreadsheet or plaintext YAML...but that's not something applicable to all projects.
One of the most valuable parts of Rails is its opinionated infrastructure...and I think that's helped it be a little more nimble from version to version.
Can't speak to Play though.
The configuration syntax (YAML) shown in https://dropwizard.github.io/dropwizard/manual/configuration... looks quite nice. It says there you can use JSON instead. The syntax Gradle uses (i.e. Groovy) has a lot of cruft, including even a full programming language, which can be misused in build config files so best steer clear.
Rails run perfectly on the JVM.
Basically, a few years ago I thought it was easier to build my own framework in Golang, C, C++. I've also used PHP, Node and Flask from time to time. After doing all that, I had a pretty good understanding in how it all works, and can see the beauty in some of the way Rails works. I definitely think it'll keep growing and is worth learning if you're into web development.
If a person know Git, HTML, JavaScript, and one server-side language, I can teach them enough Rails to build production apps in a few weeks. I've had a lot of success with that.
citing the parent
no that's bullshit, just do the rails tutorial online and you'll be good to go. OF course you need to know Ruby. Like with any other language, you can't just learn the framework.
Railscasts was active. This was huge. Repeating for emphasis. Railscasts was huge for me.
There were a few headscratchers along the way - RJS, components, maybe a few other oddities (I think turbolinks falls into this category), but they tend to get removed as time goes on if they don't work for a lot of people. The Rails team may get pretty enthusiastic about some weird stuff now and then, but they're also pretty good about reversing their mistakes. They seemed to have learned from the 2->3 transition hell as well. Upgrades are fairly painless now.
That said, it's still very much relevant. It's been polished to the point where you can really do a lot with very little work. There are solid, well maintained gems that do lots of common tasks (although there are a few things that are strangely missing from the community). The REST convention is very powerful, and the code is easy to follow.
I resisted the move towards complex js front end frameworks because I was tired of figuring out which one to learn. That hasn't changed. I abhor the pace of js framework development - I can't justify learning a lot of it from a business perspective. It is just too unstable. I have clients using Rails apps I wrote 7 years ago that are still very maintainable, and that is great.
When I need complex UI's I take a hybrid approach and have rails load miniature angular apps on a page by page basis. If the view is complex enough, I have it load up a single file angular app to handle that complexity - but only for that page. A 4 line helper loads the angular files automatically. Otherwise, it's all Rails. I've found this approach to be very flexible - it's able of delivering a very rich UI where needed without overcomplicating the good stuff that Rails provides for free.
Even if I were starting over today, I think Rails would be at or near the top of my list. I feel for folks picking it up now, though, as it is a little tougher than it used to be.
I recreate the view directory structure in the assets folder, but only for views where I need a complex (angular) UI. So I might have a file in assets/javascripts/users/show.js because the users#show view is more complicated than I want to do in rails.
If that asset file exists, I have a helper automatically load it into the head section of the view layout when the users#show action is hit. The helper itself is only a few lines of some obscure rails code that looks up the name of the controller, action, etc and looks up the files in the assets directory. If you match the view directory structure to the assets directory structure, it stays very organized and is all done by convention.
In the show.js file, I will create an entire mini angular app (one file). The show.html.erb view will just contain angular markup (and maybe some erb). It's that simple. If Angular needs some instance variables from rails, I just pass them in to js with a couple lines in a <script> tag at the beginning of the view.
If I need a custom directive, I put the templates for those in public/templates (there may be a better place for these, depending on what you're doing - for my use case, this was fine).
There are some downsides - you have to separately compile each js file. I suppose you could do them all together, but I like keeping them separate. But largely, you can lay angular on top of rails in a very unintrusive manner this way. It probably doesn't work for every situation - you have to keep your angular apps small or it gets complicated again. But it really lets you enhance the UI of a rails app without a lot of technical debt. Code reuse can be a challenge (organizing bits that are shared is kinda wonky), but often the angular apps are small and simple enough that this isn't really a problem. Repeat yourself a little. It won't kill you.
An example of where I've used it is to load a chart and some daily/weekly/monthly selectable data that is sortable by columns, by date, with pagination, search fields, etc. I make the data available via rails as JSON, and just have the angular app pull it all in for the user to manipulate.
Another would be a form that creates a query interface similar to the one used by google analytics to create custom segments.
There may be better ways to do all this, but this approach has served me well. It's a little rough, and I'm sure it could be improved. As always, YMMV.
I'm finding Turbolinks partial replacement a good option in some cases too.
The thing with not doing a traditional SPA in one Javascript framework, is you can rip out or add anything at anytime. So say in the next 30 seconds when a new Javascript framework comes out, I can use that in my Rails app. If I embraced Angular for my entire app it would be impossible to change the framework out. I've been able to play with React, Knockoutjs and others on certain parts of my app because I'm still embracing traditional navigation(with Pjax or Turbolinks)
For those who want to remember the mood of the times, circa 2005, Bruce Eckel did a great job of capturing it in his December 2005 essay "The departure of the hyper-enthusiasts":
http://www.artima.com/weblogs/viewpost.jsp?thread=141312
He was lamenting/celebrating the sudden end of the hype around Java.