4 ms·
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
by damoncali 11y ago
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.
- bphogan 11y agoI 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.
- damoncali 11y agoI 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.
- dham 11y agoGood 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)