00:00:13.599
So this is a Rails conference, I think one of the best in Europe. I was thinking about writing a Rails application.
00:00:24.320
I did some workshops recently, and I had a lot of bootstrapping tasks. You know, every second day, I had to bootstrap a new Rails application.
00:00:35.920
Of course, there are scripts for that, but there are some key lessons I've learned.
00:00:40.160
Awesome! So, yet another Ruby on Rails application in X minutes and in easy steps. Let's set X to 15 minutes and see how far we can get within these steps.
00:00:56.800
The app is very simple; it's basically a simple club bouncer app. You know, the guy that doesn't let you into the pub? Well, I know that guy. He's always saying, 'Those are too sporty shoes; you can't go in.' So, this is a similar kind of app like Facebook events. Not invited people can only see that there is an event, but they won't see who's coming or where it is.
00:01:34.400
In our application, users can create a party. They can log in with Facebook, create a party, invite other users, and the invited users can see party details and the guests list. However, non-invited users can log in and see the party but without any details or other participants.
00:01:47.360
We will try to deploy this to Heroku. An easy Rails setup is straightforward; that's obvious and easy to Google. We are going to set up the database, migrate the data, and create the database. After firing up the server, it works awesome!
00:02:09.679
Using scaffold is a really useful tool. Every new Rails application now needs to be bootstrapped. The default layout has to be user-friendly. So let's generate some scaffolds, make them look pretty, and keep migrating again and again.
00:02:22.480
Awesome! Now we have users, but they cannot log in yet. So you Google how to log in a user with Facebook. Omniauth is supposedly the best solution. You just add some columns to your user model and update your routes, and it works!
00:02:38.319
For authentication, you need something in your user model to create the user from the Omniauth data. This is the default method that they suggest. Furthermore, you also need to make adjustments in the sessions controller. Here, we will fetch the info that Omniauth sends us. If we find the user, we're good to log him in; otherwise, we create the user. There is even a bit of security involved here as we reset the session to prevent session fixation.
00:03:04.640
To finish this off, we will set our current user in the application controller so we can use that everywhere and add a method to check whether we are logged in or not. Awesome! Now, let's see the results. Oh! Let's see what went wrong.
00:03:43.599
Oh, that was actually easy. I forgot to migrate and the helper methods needed to be specified in the proper way. Works! Awesome!
00:04:03.600
We assume the user will have parties and will be able to invite other users to those parties. So let's create the parties. We now know that we have to migrate every time we do something, so we do that again.
00:04:20.479
Again, we create some nice scaffolds for the parties. However, when we go to see them, it looks like the user was treated as a string, so you cannot create a party unless you somehow manage to serialize the user object to a string yourself. Let's fix that by changing the field to a select.
00:04:40.240
Well, there’s still an issue because the users are still not displayed correctly. Google again! Stack Overflow, etc. It's an easy fix, and that's awesome.
00:05:11.280
Time’s up! This went fast since I trained this a couple of times. However, in reality, I was Googling all over the place to find solutions that are default in the Rails community now. Time's up – we managed to do 16 steps or actions, which I guess is good.
00:05:44.000
Let’s see what we got: we have a working application! That’s fine. The external provider login is working, which is good. Users can create parties with descriptions. It’s not entirely usable but given that it was done in 15 minutes, come on, that’s okay.
00:06:05.920
It took another 16 minutes to finish this with the Rails thing, following guides and what we found on Google, so the total time was about 75 minutes. Thank you, Mr. President!
00:06:31.360
It looks like it's not bad; in 75 minutes, we've created a working application that makes people miserable because they can't see the party details. Come on, that’s good!
00:06:52.720
So can you say with me, 'Rails is awesome'? Come on! On three… One, two, three!
00:07:05.760
Oh! Did you just get excited about Rails? A few things went wrong, and we're going to see what exactly went wrong.
00:07:23.680
To be honest, I cheated a little bit. I only showed you what I did in 15 minutes; I didn't show you the sluggish process that followed in the next hour.
00:07:59.040
What went wrong? I was a bit slow at this, which was a surprising realization. I'm not very skilled at doing Rails scaffolds. I'm not sure if that's a skill you really need, but I got better after a few practice sessions.
00:08:31.480
There were more errors on the way, and toward the end, there were even more issues. Testing, surprisingly, turned out to be tricky, as the guides suggest.
00:09:21.760
A few tricky parts of code I copied from Stack Overflow proved to be problematic. I marked those parts for you. In your tests, you need to have the correct environment setup.
00:09:48.399
There's also a difference in workflows between creating a user and finding a user. The finding process is in your controller while the creation process is in your model, so you cannot treat them equally in your test, which is a bit frustrating.
00:10:39.600
In any stop in your user testing, it always has to respond to an ID. This is not a real issue, but it's something I found later during the final 16 minutes.
00:11:02.640
I was sending invites to parties. What party can go on without invites, right? I wanted the inviter to be able to send a batch invite, so that when they are inviting guests, they aren’t bombarded with invites themselves.
00:12:01.440
This is easy to implement, but it creates a dependency in your test. It can be challenging to track your user and the relevance of missed invites. My test was complicated by the fact that some validation on invites was firing all the time.
00:12:49.360
I was trying to make sure my users don't invite themselves to the party, so they don't feel forever alone. This requirement made testing complicated.
00:13:20.080
This presented numerous issues with Rails. It appears the whole Rails ecosystem has its drawbacks. It's hard to maintain and develop in the first place.
00:13:55.680
The code was convoluted and difficult to understand, especially the controller parts. The tests raised concerns as well.
00:14:15.920
In 2014, we already knew Rails had issues. We know that now, and we could have known for years.
00:15:04.560
Here’s a code climate score from a three-year-old project we maintain at work. It's getting better, but at the time we took it over, it had a score of around two. If you're not using code climate, anything below three is concerning.
00:15:47.680
This project was just nine months old and already very low at 1.5. It had several security issues flagged by standard code analysis.
00:16:09.120
What we have here is a few weeks old Ruby on Rails application that’s already at a very concerning 1. Anyway, a lot is going on and things need to change.
00:16:41.680
So, what we really see is a legacy Ruby on Rails application that we all need to be aware of, and that's regrettable. The truth remains that while Rails is great, its challenges are significant.
00:17:25.839
Rails is an awesome foundation, and it's great for startups. If I can build a meaningful application in just 75 minutes, imagine how quickly I could develop a full-fledged application with a few extra days!
00:17:50.239
For beginners, Rails is incredibly beneficial. Even though I was using only information found online, it worked eventually, though a bit challenging.
00:18:17.600
For me, Rails offers a good basis for a framework that fulfills your specific cases. No one template will cover all applications.
00:19:00.920
Every case is unique, and you, as the developer, will have to flesh out the framework for your needs. The way you structure your framework will ultimately define how your code will be followed by others.
00:19:44.320
Every other person who comes after you will see how you’ve constructed this code and probably mimic your approach. In essence, Rails sets the groundwork for developing your own coding rules.
00:20:07.760
It’s essential to note that it helps create a shared understanding for other programmers who will engage with your application down the line.
00:20:30.880
To conclude, I prepared a complicated graph that illustrates this well. Please focus because it took weeks to assemble this diagram.
00:20:53.440
This illustrates the structure of our community, with everyone represented, especially you, the most valued attendees. Many others couldn't or didn't bother to show.
00:21:12.560
I don’t have a one-size-fits-all solution for involving others in this scene. But remember, you can educate newcomers, lead workshops, and spread awareness.
00:21:25.280
Your responsibility is to extend your knowledge and inform them, ensuring they don't fall into the trap of creating more legacy applications.
00:21:43.720
That was my presentation on the 15-minute Ruby on Rails legacy application, aka 'The Cake Is a Lie.' Thank you!
00:22:04.320
Questions?
00:22:07.840
Yes?
00:22:11.760
The applications with the low scores? Those are clients just interested in our services.
00:22:25.760
Ultimately, we don't actively seek out projects like those.
00:22:38.240
The previous code base we had from India was acceptable; I can't really comment on it.
00:22:48.480
Don't call DHH! The issues appear to be multiplying, and Rails isn't scaling as needed. It's very much a responsibility for the developer.
00:23:08.560
Don’t rely solely on him for guidance on how to do your work.
00:23:14.720
We can certainly get better at this, and there are numerous solutions out there that aren’t part of default Rails, but since Rails serves as a great foundation for your application.
00:23:40.160
You can easily incorporate these alternatives, like service objects and decorators.
00:23:50.880
And finally, just out of curiosity, is anyone here using anything outside of Rails? I'm not using any other framework on the backend.
00:24:11.680
For my projects, I use a framework based on my own thoughts and ideologies over Rails.
00:24:22.560
This applies to all applications, and I won't blame the framework for my mistakes.
00:24:42.080
That's it. Thank you!