Lesson 10
Defining the PUT Route to Update a Book
Video Transcript
Welcome back. So we learned how to get all the books, how to get a specific book
by ID, how to create a book. Now let's learn how to update an existing book.
Looking back at our data structure here in book.js. Let's say I want to change
the title of Donkey Holiday book from to something else. Now we need a way to
first get this guy, then we change the title, then we update this guy. Now for
the route itself, it's going to be a foot slash book slash the book ID. So we give
the book ID as a route parameter so we can first find what book we want to
update. And then for the foot request, we're gonna give it a request body with
the actual title we want to modify. From Donkey Holiday, let's say, I don't know,
Mr. Kihote. Let's change the title to that. So we're gonna have a body in the
request. We're gonna have a request parameter. So to get these guys remember
we use rack.body for the request body and rack.params for the request the
route parameter. Okay, it's gonna be a foot verb. Let's get started. After post,
we're gonna use app. You guessed it. Put slash book slash book ID with a colon
prefix. The usual rack and rest parameters for the function right here.
Then so we need a method in the book module to update the book, right? So let's
first do that. Going back to the MOOC module. We have to do this because we
don't have an ORM nor a database setup. So we're faking it with this module. Okay.
Now let's create a new one here update. It's gonna be somewhat similar to what we
didn't create and find one combined kind of. Anyway, so update needs first you
need the ID of the book to update. So let's give an ID and then we need the
actual new properties for the book. So let's just call it book. Now first
you want to find the book. So we're going to use the same logic right here. So
existing book is going to be books dot fine. Book is the parameter where the
book ID is going to be the ID fast as an argument that enable soft wrap so you
can see. Now we have that or we don't have it because what if the book doesn't
exist? Well if it does not exist we should definitely return no or something.
Anyway, but if it does exist we are going to go here after we find the guy we
need to update the title. So if it's just one property you can just make a very
easy for example you're gonna create the updated book. It's just the existing
book of an object whose ID is the existing book ID but the title is going
to be what? This argument book dot title because it's the new title. That's one
way but if you have so many properties what are you gonna do? Type one by
one? Yeah you could do that. There's another way if you want to include all
the properties from the book into the existing one in a new object and you
can do like that as so. Just do a three dots existing book then you say whatever
from the book here. So this is what this is doing is it copies all the
properties from the existing book then copies all the properties from book and
if book does happen to have the same properties already defined here previously
it's going to overwrite them. Okay anyway with that we can just return. Oops we
cannot because we need to actually update our fake database. So what I'm
going to do is I'm going to use a map method of the array type because if
you look at it an update is actually just you're gonna go and find the one you
want to update. Just change one thing. The length of the array is going to stay
the same so we're gonna map through this guy. If it's not the book we want to
update we don't do anything just return the object as is. Otherwise if this is
the book we want to update we return a new object to this list with this title
replaced. Okay so let's do it. So let's get to books.map and let's do
something here. So if the book.id is the same as the id we want to change right
we are going to return that updated book. Now if it is not we just return the
book itself unchanged. So this map is going through each book in the list. If
the book.id matches the id of the book we want to update we return updated book.
That means the map is going to include in the new array the updated book. Otherwise
it's going to include the book as is without any changes. Mind you that the
map function it creates a whole new list so we have to reassign it to books like
so because this is not going to mutate the original books. Okay now after we do
that we finally update the list and we can return the updated book to the
client who called it because maybe we want to return the updated book back to
the client. Okay so let's say this go back to our route. Now how we're gonna do
this we're going to do book.update what's the id of the book we want to update. The
id comes from the request parameter so we can say rack.what.params.book.id but
remember this is a string because it's in params so we need to parse it into an
integer otherwise this strict equality right here is not going to work because
we have an actual number versus a string if we don't parse it. So let's remove
this guy. Extract it and make a variable book id parse int parse it as an integer.
I'll just put the 10 there just to make sure it's a base then and then we have
the idea of just use it in update and finally we need to pass it the updated
properties. Okay so you could just pick take all of them if you want or you can
filter out the unwanted ones I'll leave it to you to filter out as an exercise.
I'm just going to include request.body like so and then this is going to update
our fake database our coded data and then we just return this guy back to
actually we send the response right send this guy back to the user so the
client gets a copy of the updated book. Okay let's test it out. So we have three
books again notice there's no more four and five because we restarted the server
our hard-coded data is in memory and will be wiped out as and reset to its
original state every time we restart the server. So we got these guys going let's
change the name of Donkey Hoodie to something else. So let me change the
verb here to actually let me go to the another tab so we can reuse the other
one we got to use put HTTP localhost slash books slash to to is the Donkey
Hoodie books id we need a body remember let's use raw not text but
JSON application slash JSON we need want to change the title of the book to Mr.
Kihote for example now let's try it. Did we get any response yes we did it's just
down here I would like to drag it up so you can see better. So this is our
request body this is our response body so we got a title not changed to Mr.
Kihote to confirm that our database or fake database actually actually
changed we have to do a get slash books to see that the index the second
element is Mr. has now title Mr. Kihote and all the other records are
unchanged okay so that's a 200 okay everything went well. So let's just
review what we did in this lesson we learned how to use the HTTP app.put to
make a put request to update a book the endpoint is slash books slash colon
book id book id comes from the request parameters which is always a string so
you need to parse it into an actual number to make sure of things match
correctly inside our fake database search. Then we after we pass it to our
fake database to update the book using the id and the rack body with the
updated properties we send it back to the user of the 200 okay all right. Now
what if it doesn't exist oh that's something we didn't talk about right
let's go back here to our postman and try to update a book that does not exist
like book number four right now does not exist we are getting 200 okay that's not
good we should get at least a 404 right so we got no here so let's get back to her
to our route so this guy actually could be no so we should extract this guy into
updated book it's going to be equal that then if there is no updated book if
that is no right we are just going to return right away with a response send
what remember the status code let's put a status of 404 beforehand so we're
going to send a response with the status 404 and we're going to send a
message saying that the book you want to update is not does not exist how about
that okay so that's our error kind of handling here so let's try again oh
actually I forgot to place the updated book right here let's go to postman so
do what we started the service so it don't change that but we don't care
anymore anyway so we're going to do a put on book slash port which does not
exist and now we get 404 and add pound the book you want to update does not
exist okay so I just wanted to finish with that doing the 404 if the actual
book you're trying to update does not exist so I'll see you in the next lesson
No comments yet (loading...)
No comments yet (loading...)
Did you like the lesson? 😆👍
Consider a donation to support our work: