All Episodes

June 19, 2026 20 mins
In this lesson, you’ll learn about: rapid resource building in Ruby on Rails using scaffolding and manual prototyping, and how to balance speed with control1. Understanding CRUD Operations🔹 Core actions:
  • Create → add new data
  • Read → retrieve data
  • Update → modify data
  • Delete → remove data
👉 Key Insight
CRUD operations are the foundation of every web application2. The Power of ScaffoldingUsing Ruby on Rails generators:🔹 Command:
  • rails generate scaffold Crypto name:string price:decimal
🔹 What it generates:
  • Model
  • Controller
  • Views
  • Routes
  • Migrations
👉 Key Insight
Scaffolding enables rapid prototyping by generating a full feature instantly3. When to Use Scaffolding🔹 Best for:
  • Quick prototypes
  • Learning Rails structure
  • CRUD-heavy applications
🔹 Limitation:
  • Generates extra (unused) code
👉 Key Insight
Scaffolding prioritizes speed over precision4. Manual Prototyping (Cherry-Picking)🔹 Approach:
  • Build only what you need
🔹 Steps:
  • Create controller manually
  • Define custom routes
  • Build minimal views
👉 Key Insight
Manual prototyping gives full control and cleaner architecture5. Custom Routes and Controllers🔹 Example:
  • Define only specific endpoints instead of full CRUD
🔹 Benefit:
  • More efficient and tailored application flow
👉 Key Insight
Custom routing reduces complexity and improves maintainability6. Advanced Database Queries🔹 Using Active Record:Crypto.where(name: "Bitcoin") 🔹 Variations:
  • Key-value queries
  • Parameterized queries
  • Symbol-based conditions
👉 Key Insight
The where method enables flexible and powerful data filtering7. Managing Model Associations🔹 Relationships:
  • has_many
  • belongs_to
🔹 Example:
  • A Company has many stock prices
  • A Crypto has many price records
👉 Key Insight
Associations connect related data into a cohesive system8. Using Rails Console🔹 Command:
  • rails console
🔹 Use cases:
  • Insert test data
  • Verify relationships
  • Debug queries
👉 Key Insight
The console allows direct interaction with your database before UI integration9. Scaffolding vs Manual Approach🔹 Scaffolding:
  • Fast
  • Automated
  • Less control
🔹 Manual:
  • Slower
  • Precise
  • Fully customizable
👉 Key Insight
Great developers know when to use each approachKey Takeaways
  • CRUD is the backbone of resource management
  • Scaffolding accelerates development significantly
  • Manual prototyping avoids unnecessary complexity
  • Active Record queries provide flexible data access
  • Associations link data into meaningful structures
Big PictureThis workflow teaches you how to:👉 Rapidly prototype features
👉 Customize application behavior when needed
👉 Balance speed and control in developmentMental ModelStart with scaffold → evaluate needs → remove unnecessary parts → customize controllers/routes → query data → refine structure

You can listen and download our episodes for free on more than 10 different platforms:
https://linktr.ee/cybercode_academy
Listen
Watch
Mark as Played
Transcript

Episode Transcript

Available transcripts are automatically generated. Complete accuracy is not guaranteed.
Speaker 1 (00:00):
Picture this. You're staring at an empty terminal window.

Speaker 2 (00:03):
A familiar feeling for a lot of us, right.

Speaker 1 (00:05):
And you have this concept for a web application. Maybe
it's a a sophisticated portfolio tracker, or like a system
to manage a massive inventory database.

Speaker 2 (00:15):
Something that usually takes weeks to build.

Speaker 1 (00:17):
Exactly, But instead you type a single line of code,
you hit enter, and the terminal just explodes with activity.
I mean files are generated, databases are migrated, roots are mapped.

Speaker 2 (00:28):
It's basically instant.

Speaker 1 (00:29):
Yeah, within seconds, you boot up a local server, you
open your browser, and you are staring at a fully
functioning web application. You can input records, view them, modify them,
delete them. It's a living interface that just well materialized
out of thin air. It feels like pure developer magic.

Speaker 2 (00:47):
Oh. Absolutely. The ability to move from like an abstract
idea to a working prototype with almost zero friction is well,
it's one of the most intoxicating experiences in software development,
it really is. The frameworks like rubyond Rails were specifically
designed to enable that exact kind of rapid materialization.

Speaker 1 (01:06):
And that is exactly the architecture we're exploring in our
deep dive today. We're acting as your audio guides dissecting
the anatomy of prototyping with rubyond.

Speaker 2 (01:16):
Rails, breaking down the magic tricks.

Speaker 1 (01:18):
Right, well, look at how this instant application magic actually functions.
But and this is our primary mission today, we want
to understand why relying blindly on that automation is a
massive trap.

Speaker 2 (01:31):
Huge trap.

Speaker 1 (01:32):
Yeah, because if you don't grasp the mechanical reality running
under those automated commands, you're essentially building a house of cards.

Speaker 2 (01:39):
That's a great way to put it, because everything we
do in Rails, and frankly in most web development, usually
comes back to the urd paradigm crud. Right, whether you're
architecting a massive social network or just a tiny internal tool,
your foundation is essentially creating, reading, updating, or deleting database records.

Speaker 1 (01:58):
It's the beating heart of basically ninety of all web apps.
I mean, if you're posting a status, fetching a news feed,
editing your profile, scrubbing an old photos, just doing cre exactly,
the underlying database operations are fundamentally identical. And because they're
so universal, RAILS gives us a built in mechanism to
generate the entire vertical slice of code needed to perform them.

Speaker 2 (02:21):
Yeah, it's an automated code generation process called scaffolding.

Speaker 1 (02:24):
So okay, let's unpack this scaffolding thing, because we know
we need crud. So how does rails actually give it
to us. Let's look at the easy button first.

Speaker 2 (02:33):
Sure, let's examine that automation practically. Imagine you want to
track a roster of cryptocurrencies.

Speaker 1 (02:40):
Okay, like a crypto tracker.

Speaker 2 (02:41):
Yeah, you need the name of the asset and the
data launched. To scaffold this, you jump into the terminal
and run a command. It's literally just Rails generate scaffold
cryptocurrency name, dot string started, dot dot date.

Speaker 1 (02:54):
Just that one line, just.

Speaker 2 (02:55):
That one line, and the moment you hit enter, the
framework generates well five I have critical pieces of application
architecture simultaneously.

Speaker 1 (03:03):
Okay, let's break those five pieces down, starting at the foundation.
So the first thing it builds is a migration.

Speaker 2 (03:07):
File, right, which is essentially a set of blueprints for
the database.

Speaker 1 (03:11):
Yeah. So instead of writing raw sequal commands, you know,
like create table, you get a Ruby file that describes
the changes you want to make, and when you run
that migration, Rails translates your Ruby code into the specific
seql dialect your database uses.

Speaker 2 (03:26):
Exactly, whether that's postgresscoal my sequels, will I whatever.

Speaker 1 (03:31):
So the migration creates the physical storage space. What's the
second piece.

Speaker 2 (03:35):
The second generated piece is the model. The model is
a Ruby class that represents the cryptocurrency entity.

Speaker 1 (03:41):
Itself, the brain of the operation.

Speaker 2 (03:43):
Yeah, this is where your business logic, your validation rules,
and custom data processing will eventually live. It communicates directly
with the database table you just migrated.

Speaker 1 (03:53):
Okay, so we have the storage in the brain. The
third component is the controller. Now, I've heard the controller
described as a traffic but I don't know that metaphor
always felt a little flat to me.

Speaker 2 (04:03):
Yeah, traffic cop just sort of points cars in different directions.
A much more accurate analogy for the controller is the
lead expediter in a high end restaurant kitchen.

Speaker 1 (04:12):
Oh I like that.

Speaker 2 (04:13):
Yeah, So the waiter hands the expediter a ticket that's
the user's web request. The expediter doesn't cook the food themselves.
They turn to the chefs, which are the models, and
requests specific ingredients from the pantry.

Speaker 1 (04:25):
And the pantry is the database.

Speaker 2 (04:26):
Exactly. Once the model hands back the raw data, the
expedier organizes it and passes it to the view, which
is the final plated dish presented to the customer.

Speaker 1 (04:35):
Which brings us perfectly to the fourth component, the views.
Scaffolding generates all the necessary HTMIL templates and forms.

Speaker 2 (04:43):
It does all the heavy lifting there.

Speaker 1 (04:45):
Yeah. It builds an index page to list everything, a
show page for individual records and the forms you need
to create or edit them.

Speaker 2 (04:52):
And tying all of this together is the fifth component,
which is the routing.

Speaker 1 (04:56):
File updates the switchboard.

Speaker 2 (04:58):
Exactly the switchboard. When a user navigates to a specific URL,
the router parses that address and determines exactly which controller
and which specific method inside that controller should handle the request.

Speaker 1 (05:10):
So using scaffolding is basically like buying a fully furnished
prefab house.

Speaker 2 (05:15):
That's a perfect analogy.

Speaker 1 (05:16):
It's incredibly fast. You save hours, maybe days of boilerplate coating.
You literally just turn the key, walk in, click a
new button, type bitcoin with a launch date of January first,
two thousand and nine, and save it. It just works.

Speaker 2 (05:30):
The immediate gratification is undeniable. But and here's the catch.
A prefab house comes with a pre defined layout and
a lot of furniture you might never actually use. Right,
it provides a one size fits all solution for a
digital landscape that almost always demands custom tailoring. And more importantly,
apps rarely exist in a vacuum. A single standalone model

(05:52):
is trivial. Real world applications require complex relational data architectures.

Speaker 1 (05:57):
Okay, so let's explore that relational complexity. We have our
cryptocurrency model, our prefab house. But a crypto asset is
practically useless to track if we aren't also tracking its
price volatility over time.

Speaker 2 (06:08):
Right, A static coin name doesn't tell you.

Speaker 1 (06:09):
Much exactly, So we need a new entity, let's call
it a cryptoprice that connects directly to the original model.
How do we adapt our prefab house for that?

Speaker 2 (06:17):
We run another scaffold command for crypto price. We tell
it we need a numerical price and a date. But critically,
we have to establish a structural link.

Speaker 1 (06:25):
Because a price of fifty thousand dollars is entirely meaningless
if the system doesn't know if it belonged to Bitcoin
or some random mean coin exactly.

Speaker 2 (06:35):
So, in our command we add a specific data type
called references. We tell the framework we want a cryptocurrency
attribute and its type is references Nuah.

Speaker 1 (06:43):
Okay, and this is where we actually touch the database mechanics,
right we do.

Speaker 2 (06:48):
Adding that references keyword instructs the migration file to establish
a foreign key. At the database level, it creates a
dedicated column typically named cryptocurrency kylid inside the new price.

Speaker 1 (06:59):
Table, and that column is rigidly constrained to only accept
ID numbers that actually exist in the main cryptocurrency table.

Speaker 2 (07:06):
Right. It enforces referential integrity.

Speaker 1 (07:09):
Okay, but wait, if I look at the screen, does
it just show me a confusing ID number instead of
the name.

Speaker 2 (07:14):
That is exactly what happens. The database architecture is sound,
but scaffolding generates interfaces based on raw data types. So
if you boot up the server and look at the
default form Rails just built, you.

Speaker 1 (07:27):
Get a blank textbox asking for an ID number.

Speaker 2 (07:29):
Yes, the system expects you, the user, to magically memorize
that Bitcoin is ID number one, Ethereum is ID number two,
and so on, which is.

Speaker 1 (07:39):
An unacceptable user experience for literally anyone interacting with the app.

Speaker 2 (07:43):
Horrible experience. So we have to open up the generated
code and manually override the automation how do we do that?
We navigate to the HTML view file for that form.
We rip out the raw text box and replace it
with a built in RAILS helper method called collection select.

Speaker 1 (07:58):
Okay, what does collection select do?

Speaker 2 (08:00):
It dynamically generates a clean HTML drop down menu. We
pass it instructions to fetch cryptocurrency dot all, which queries
the database for every available asset.

Speaker 1 (08:10):
Nice, so it shows the human readable names to the
user in a dropdown right, but in.

Speaker 2 (08:14):
The background, it submits the hidden ID number to the database.

Speaker 1 (08:17):
So the form is fixed. We select bitcoin from our
new dropdown. We input a price of fifty thousand dollars
and save it. But wait, the automated show page presents
the exact same problem, doesn't.

Speaker 2 (08:28):
It It sure does. It just prints cryptocurrency one on
the screen. It's just echoing that foreign key.

Speaker 1 (08:34):
So how do we actually display the data properly?

Speaker 2 (08:37):
Resolving this requires leveraging the model relationships RAILS established when
we use that references keyword. If you open the cryptoprice
model file, you'll see a single line of metaprogramming that
RAILS injected automatically belongs to dot cryptocurrency belongs to right,
and this isn't just a label. It's a powerful method
that dynamically generates SQL joy in queries under the hood.

Speaker 1 (08:59):
Which is awesome because it allows us to chain our
commands in the viewfile. Instead of telling the view to
just print the raw ID, we can write what cryptoprice
dot cryptocurrency.

Speaker 2 (09:09):
Dot name Exactly. You're telling the application to take the
specific price object, use that belongs to association to automatically
query the parent table, fetch the associated asset, and extract
its name.

Speaker 1 (09:20):
The elegance of that syntax is just.

Speaker 2 (09:22):
Striking, it really is, and the best part is those
relationships are bidirectional.

Speaker 1 (09:28):
Meaning if a price belongs to an asset, the asset
must logically possess multiple prices exactly.

Speaker 2 (09:33):
So if we open the cryptocurrency model, we manually add
the reciprocal declaration has many dot crypto prices, and that.

Speaker 1 (09:41):
One line of code completely opens up the architecture. It
means we can go to the main Bitcoin show page,
grab the bitcoin object, and simply type cryptocurrency dot crypto prices.

Speaker 2 (09:51):
Right. The framework translates that into a SQL select query
with a ware clause matching the foreign key.

Speaker 1 (09:57):
So we can then look through that collection in our
HTML and just render a comprehensive table of every recorded
price history for that specific asset completely dynamically.

Speaker 2 (10:07):
Yep. So we're seeing how to wrangle and customize the scaffolding.
But eventually, you know, you reach a point of diminishing returns.
What do you mean, Well, what happens when you have strict,
narrow requirements. Suppose you need a lightweight dashboard widget that
only displays a list of data. No creating, no updating,
no deleting, just a list.

Speaker 1 (10:25):
Oh, I see, because if you use scaffolding for a
read only feature, yeah, you're generating massive amounts of dead
weight exactly. You get unused htmail files, complex controller actions
for editing that will literally never be triggered, unnecessary routes.

Speaker 2 (10:39):
It's just clutter. It expands your code base, makes the
application harder to maintain, slower to load, and critically, it
unnecessarily widens your security attack surface.

Speaker 1 (10:50):
So in that case, we have to abandon the automated
commands entirely and build the feature surgically from scratch. But wait,
if scaffolding takes like two seconds, aren't we wasting time
writing controllers from scratch?

Speaker 2 (11:01):
It seems like it, right, But starting with scaffolding defeats
the purpose of understanding how models actually fit into the
grander scheme of things. By cherry picking exactly what we need,
we keep our application lightweight and purposeful.

Speaker 1 (11:14):
Okay, so let's execute a manual build. Walk me through it.
Let's introduce a new entity, companies. We want a pure
index page, just a simple list of all the companies
we're monitoring.

Speaker 2 (11:22):
Okay, The very first move is establishing our expedior. We
manually create a file named Companies controller dot r B.
Inside that controller, we define a single method called index.
This is where we gather our ingredients. We need to
query the database, so we write company dot all and
assign the result to an instance variable.

Speaker 1 (11:42):
Usually denoted with an AD symbol right.

Speaker 2 (11:44):
At companies exactly, so the data is prepped. Then we
manually create the viewfile, a raw HTML template specifically tied
to that index method, and.

Speaker 1 (11:53):
We take our at companies variable and write an iteration
loop for every individual company in that collection. We generate
a new table row explicitly choosing to render say, only
the company's name and its stock ticker symbol.

Speaker 2 (12:06):
And it's incredibly lean. We have absolute control over every
bite of code.

Speaker 1 (12:11):
But if you try to visit companies in your browser
right now, the application will just crash entirely. Right. The
framework has no idea what you're asking it to.

Speaker 2 (12:18):
Do because we miss the switch port.

Speaker 1 (12:20):
Right, Scaffolding silently wires up the routing file for you.
Because we're building manually, we have to open the roads
dot RB file and explicitly map the architecture.

Speaker 2 (12:30):
We have to write a rule that dictates when an
incoming httpp get request targets the URL, companies route that
request directly to the company's controller and fire the index method.

Speaker 1 (12:42):
Okay, so the infrastructure is flawless now, but an index
page is totally useless without actual data to display, which
brings us to the concept of data seating and the
hidden complexities of the Rails console.

Speaker 2 (12:54):
Ah. The console it's a command line interface that loads
your entire Rails application environment, models, data connections, configurations without
actually booting up a web server.

Speaker 1 (13:03):
It's super powerful it is.

Speaker 2 (13:04):
It allows developers to interact with their application logic in
real time, making it an essential tool for testing queries
and populating initial data.

Speaker 1 (13:12):
So let's use the console to populate our new dashboard.
You open the prompt and type company Company, dot new,
you assign the name Tesla and the ticker symbol Tsla.

Speaker 2 (13:22):
You hit enter and the console returns a beautiful Ruby object.

Speaker 1 (13:26):
Yep, looks great. You then create a few stock prices,
link them to the Tesla object and hit enter again.
Everything looks perfect. So you close the console for fresh
new dashboard in the browser and it's completely empty. The
data you just created is gone.

Speaker 2 (13:41):
It vanished. And this is a fundamental architectural misunderstanding regarding
the memory allocation.

Speaker 1 (13:46):
Yes, let's highlight this trap because it gets so many developers.

Speaker 2 (13:50):
When you use the dot new command and the console,
you are merely allocating a block of temporary space in
the server's RAM.

Speaker 1 (13:56):
You're creating a Ruby object, but you haven't actually spoken
the database yet.

Speaker 2 (14:01):
Precisely, the moment you exit the console session, that RAM
is cleared and your phantom data just evaporates.

Speaker 1 (14:07):
So to persist the data, you have to invoke the
dot save method. Assigning the variables is just drafting the paperwork. Essentially,
calling dot save is the trigger.

Speaker 2 (14:16):
It's the trigger that compiles your Ruby object into a
raw insert into SQL statement, fires it across the network
connection to your database engine, and writes it permanently to
the hard disk.

Speaker 1 (14:27):
So you create the price you call dot save, you
create the next price you called dot save. Only then
is the data immortalized exactly.

Speaker 2 (14:36):
Now that we have persistent data, we need to extract
it with precision company dot all is fine for an index,
but what if we want a show page that only
displays prices for one specific company.

Speaker 1 (14:47):
We need conditional logic, which requires the wear method.

Speaker 2 (14:51):
Right, the wear method translates directly into sqlwaar clauses and
rails provide several ways to invoke it, depending on the
complexity of your requirement.

Speaker 1 (15:00):
The most straightforward approach is using key value pairs. Right.

Speaker 2 (15:03):
Yeah, you pass the method of hash, where the key
represents the database column and the value is the exact
match you're searching for. So to find all prices linked
to our Tesla record, you'd write stock price, dot wear company,
dot at company, dot ID.

Speaker 1 (15:17):
It's highly readable exact match.

Speaker 2 (15:19):
Query, but real world data retrieval is rarely that clean.
You frequently need fuzzy searches, like what if a user
is searching for any company whose name contains the letter A.

Speaker 1 (15:28):
We can't use an exact key value match for that.

Speaker 2 (15:31):
No, for complex filtering. We use parameterized queries. We write
a raw squel condition as a string, but we use
question marks as placeholders for the actual values. So the
syntax looks like we're a name like a.

Speaker 1 (15:43):
Boo, percent percent and the percent signs there. Those are
SQL wildcards representing any sequence of characters before or after
the letter A. Right, But a crucial question arises here,
why use the question mark placeholder at all? I mean,
why not just use string interpolation and drop the user
search term directly into the query string.

Speaker 2 (16:03):
Because direct interpolation is a catastrophic security vulnerability.

Speaker 1 (16:06):
Catastrophic truly.

Speaker 2 (16:08):
If you drop raw user input into a database query,
you leave the system wide open to SQL injection attacks.

Speaker 1 (16:14):
Right. A malicious user could type a specific string of
characters that basically tricks the database into ignoring your search
parameters and instead executing destructive commands like.

Speaker 2 (16:23):
Dropping entire tables or returning secure user data.

Speaker 1 (16:26):
Oh wow. Yeah, So the question mark placeholder forces the
underlying database adapter to treat the input strictly as sanitized data,
stripping it of any executable authority.

Speaker 2 (16:36):
It is a critical layer of automated defense. Now there's
also a variation of this technique for complex queries with
multiple variables.

Speaker 1 (16:43):
Okay, how does that work?

Speaker 2 (16:44):
Instead of relying on a confusing sequence of question marks,
you can use named parameters represented by symbols you right
where name like equery query.

Speaker 1 (16:56):
Oh that's much cleaner. Yeah.

Speaker 2 (16:57):
It allows you to pass a hash of values, making dense,
multi variable queries infinitely easier to read and maintain.

Speaker 1 (17:05):
Okay, so understanding how to query the database is only
half the battle. Though. We have a surgical wear method ready.
But how does the application actually know wi company the
user is asking for when they click a link on
the web page.

Speaker 2 (17:17):
Ah? The bridge between the user's browser and our database
query is a globally available hash in RAILS called PERAMS.

Speaker 1 (17:24):
Correct.

Speaker 2 (17:25):
Right, When a user clicks a link that points to
the URL, say Companies five, the routing switchboard intercepts that request.
It takes that number five from the URL and securely
stashes it in the peram's hash under the key ride.

Speaker 1 (17:38):
So inside our manually built controller we simply reach into
that hash. We tell the database to locate the specific
company using perams.

Speaker 2 (17:46):
Dot id exactly, and once we have that precise object,
we chain our customized ware queries to pull exactly the
associated data the user requested, and.

Speaker 1 (17:56):
Boom, we have built a complete, highly optimized data pipeline
without a single line of generated boilerplate.

Speaker 2 (18:02):
It's beautiful, it really is.

Speaker 1 (18:04):
I mean, we've dissected a massive amount of architecture. Today.
We witness the immediate gratification of scaffolding, watching the framework
spin up migrations, models, views, and controllers in millisecond the
magic exactly. And we explored how to manually intervene in
that automation you know, tweaking forms and leveraging, belongs to

(18:24):
and has many associations to handle complex relational data.

Speaker 2 (18:27):
And finally, we threw the automated tools completely out the window.

Speaker 1 (18:30):
We did we demonstrated the surgical precision of building from
the ground up, wiring custom routes, defining controller methods, understanding
memory versus database persistence with save, and executing sanitized parameterized
sequel queries.

Speaker 2 (18:43):
The journey from automated generation to manual construction highlights a
fundamental truth about software engineering. The framework is a brilliant tool,
but it is not a substitute for architectural comprehension. Right,
exceptional software relies on critical structural thinking. You must analyze
the data relationships and understand the exact requirements of your

(19:05):
system before you let an algorithm write your code.

Speaker 1 (19:08):
And to reinforce that structural thinking, I actually have a
specific exercise for you, the listener. Before you open your
terminal for your next passion project, standway from the keyboard,
take a physical piece of paper and map out your
core entity. Write down the precise database columns you need,
define how it relates to other entities.

Speaker 2 (19:28):
Outline the exact CID operations that are actually required, and
just cross out the ones that aren't.

Speaker 1 (19:33):
Exactly cherry pick your entire architecture in your head and
on paper first before you let a framework do it
for you.

Speaker 2 (19:40):
Translating the abstract into a tangible blueprint forces you to
think like a system's architect rather than just a framework operator.
Relying on automation builds a working application, sure, but manually
wrestling with the underlying mechanics builds expertise. Well said, which
leaves us with a critical question to consider when you
type a command and let the frame work due the

(20:00):
heavy lifting. Whose experience is really being built yours or
the machines
Advertise With Us

Popular Podcasts

Stuff You Should Know
Betrayal Weekly

Betrayal Weekly

Betrayal Weekly is back for a new season. Every Thursday, Betrayal Weekly shares first-hand accounts of broken trust, shocking deceptions, and the trail of destruction they leave behind. Hosted by Andrea Gunning, this weekly ongoing series digs into real-life stories of betrayal and the aftermath. From stories of double lives to dark discoveries, these are cautionary tales and accounts of resilience against all odds. From the producers of the critically acclaimed Betrayal series, Betrayal Weekly drops new episodes every Thursday. If you would like to share your story, you can reach out to the Betrayal Team by emailing them at betrayalpod@gmail.com and follow us on Instagram at @betrayalpod and @glasspodcasts. Please join our Substack for additional exclusive content, curated book recommendations, and community discussions. Sign up FREE by clicking this link Beyond Betrayal Substack. Join our community dedicated to truth, resilience, and healing. Your voice matters! Be a part of our Betrayal journey on Substack.

Dateline NBC

Dateline NBC

Current and classic episodes, featuring compelling true-crime mysteries, powerful documentaries and in-depth investigations. Follow now to get the latest episodes of Dateline NBC completely free, or subscribe to Dateline Premium for ad-free listening and exclusive bonus content: DatelinePremium.com

Music, radio and podcasts, all free. Listen online or download the iHeart App.

Connect

© 2026 iHeartMedia, Inc.

  • Help
  • Privacy Policy
  • Terms of Use
  • AdChoicesAd Choices