A Single-Page App
with Vue.js and
a design and code exploration
Built with Vue 2.5 and Rails 6
So what does it take to put together a single-page app using Vue.js on the frontend and Rails as the backend API? And how would you design it in a pragmatic, straightforward way?
Find out as we unpack a full-stack app layer by layer!
“I'm making much faster progress with my project already... Most tutorials are only one-feature deep which left me with a lot of questions. I loved seeing everything working together, and being introduced to Vuex and Axios in action.” Christel Trutmann
“It's a great course and a far more efficient approach for diving into a new topic.” Frank Betorina
“I love seeing the dissection of a full architecture that works.” Magnus Rembold
“I love the Unpacked format with focus on design decisions and implementation details over pure code-writing. You provide the most useful technical training that I've seen on the web!” Wayne Hiner
Start With a Completed App and Break It Down
Become familiar with the modern landscape of single-page web app development.
This tutorial unpacks what it takes to combine a Vue.js frontend with a backend Rails API. Along the way we address many common design decisions, including:
- How is the code of the two applications organized and structured?
- What does a JSON API design look like?
- When and where are single-file Vue components used? And how is data shared between them?
- What role does a router play in a single-page app?
- When should Vuex be used to manage client-side state?
- How does authentication work and remain secure between two applications?
We start with the completed app and unpack it layer by layer, answering these questions and much more. You'll come away understanding how everything works together in harmony.
No need to piece together solutions yourself. Use this full-stack application as a springboard for creating your own apps!
The Application We Unpack
How It's Designed
14 Concise, Tightly-Edited Videos
Just the way you like 'em: easy to digest, straight to the point, paced just right.
Introduction and Setup
Welcome! Before diving into our Vue.js + Rails app let's make sure you have your development environment set up so you can follow along as we explore the code and design.
The web application we unpack (Fishub) lets anglers track which fishing baits are in their tackle box along with catches made on those baits. We start with a quick walk-through of the app's various features.
Before cracking open the code, we get a lay of the land. Fishub is designed as two distinct applications: the frontend is a single-page Vue.js app and the backend API is a Rails app. How they work together is what this video series is all about!
Vue App Overview
Now that we have the big picture, we open the lid on the Vue.js app to see how the various components, router, and Vuex store are all knitted together when the application mounts.
Rails App Overview
Looking inside the backend Rails app we see the familiar structure of models, views, and controllers as well as the API endpoints that serve up JSON.
End-to-End Feature: Fetch Baits
By taking an end-to-end walkthrough of how the Baits page gets rendered, we get an introduction to how the Vue app makes a request to the API and then consumes the returned JSON.
Client-Side State Management (Vuex)
Multiple components in our Vue app need to share state, and at times, update that state. To do this efficiently, we call upon Vuex to keep everything in sync. How does the Vuex store do that? And when does it make sense to use Vuex? Find out.
End-to-End Feature: Fetch Tackle Box Items
With a Vuex store, multiple Vue components, and the Rails API firmly in place, how does everything work together? We dive deep into the code with an end-to-end exploration of how tackle box items are requested, received, and rendered.
End-to-End Feature: Add a Tackle Box Item
With Vue, Vuex, and the Rails API knitted together for making GET requests, we now turn our attention to a POST request. An empty tackle box catches no fish, so we dispatch a Vuex action to add a bait to the tackle box. We explore that feature from the frontend to the backend.
Render The Tackle Box
With our lucky lures now in our tackle box, it's time to look at the second “page” of our application: the tackle box page. By way of various components, this page renders the items in the angler's tackle box and, more interestingly, the catches made on those baits.
End-to-End Feature: Create A Catch
Next up we log a catch, which leads to a question: How does a child Vue component communicate with its parent component? By tracing the code end-to-end we learn how to use custom Vue events.
Deciding how to handle authentication for Fishub was a major design decision. How would the Vue app track who's signed in and then communicate that to the API when making authenticated requests? And how could we address Cross-Site Scripting (XSS) attacks and Cross-Site Request Forgery (CSRF)? It turns out that relying on tried-and-true Rails session cookies proved to be great approach!
End-to-End Feature: Sign In
End-to-End Feature: Authenticated Requests
We're in the thick of it now! The Vue app knows who's signed in and is ready to make authenticated requests. And that's where two cookies come into play. We also want to enable Cross-Original Resource Sharing (CORS) so our frontend can access resources on our backend.
What Does Unpacked Mean?
You're beyond a step-by-step intro course.
Step-by-step introductory courses are great for learning syntax, vocabulary, and basic concepts. But once you've got the fundamentals down, as an experienced developer your time is better spent:
dissecting a full-stack application layer by layer without the tedious typing of all the code
focusing on the design, architecture, and actual implementation of a solid application
diving deep into the interesting parts of a complete, feature-rich application
In other words, we unpack apps in our Studio so you can put them together in yours!
For Experienced Developers
This tutorial assumes you're already comfortable with Vue.js and Rails and you've fetched data from an API before. If you're new to Vue.js, we recommend reading through the Essentials and Components In-Depth sections of the official Vue Guide. This beginner-friendly guide covers all the aspects of Vue.js we use in the videos. If you're new to Rails, we recommend starting with our popular introductory Rails course where you'll learn all the fundamentals by building a full-featured application from the ground up.
Created by Mike and Nicole
Hi, we're real people just trying to share our passion for creating stuff!
You may be familiar with our step-by-step courses on Ruby, Rails, Elixir, and Elm. But what happens when you smash (pragmatically, of course) different languages, technologies, and frameworks together? Well, working at the system level gives you the power to create some very cool applications! We're excited to unpack these kinds of applications with you in the Studio. Find out more about us…
What developers like you are saying about this course:
“I really like how they go back and forth between the code, browser view, and Vue devtools. It makes the material much more clear for me and helps me to see how the different pieces play together.” Anne Richardson
“I like that there is a working app throughout the course. Vue and Rails are hot topics for me now and I love seeing the dissection of a full architecture that works.” Magnus Rembold
“The explanations and graphics for session cookies, CSRF tokens, and CORS were excellent. Those complex topics were explained very clearly.” Wilfrid Landry
“I'm making much faster progress with my project already, now that I've seen your great example for organizing Vue with Rails! Most tutorials are only one-feature deep which left me with a lot of questions. I loved seeing everything working together, and being introduced to Vuex and Axios in action.” Christel Trutmann
“I really liked the walkthrough and clearly seeing how the two apps, frontend Vue and backend API Rails, were stuck together. It's a great course and a far more efficient approach for diving into a new topic. I did some React courses before, but had never tried Vue. In taking this course, I found out I like Vue.” Frank Betorina
“The visuals and end-to-end explanations in this course were excellent!” Brian Ball
“I love the Unpacked format with focus on design decisions and implementation details over pure code-writing. It's perfect for intermediate and above developers who want to understand the architecture and implementation without the tedium of watching instructors type out all the code. It's an excellent way to learn to do it yourself with great examples of how to go about it. You provide the most useful technical training that I've seen on the web!” Wayne Hiner