Creating REST API with Grape | Webinar #2 | RubyConf Pakistan

Video Statistics and Information

Video
Captions Word Cloud
Reddit Comments
Captions
assalamu alaikum everyone people you can hear me i hope you guys are doing well and thank you so much for joining in for this webinar today so before moving on I want to just say I want to give a huge shout out to rubyconf PK for arranging these they know their own series because they're trying to establish a culture around the tapped abilities in Pakistan that I wish that have been you know previously they should have been done previously in the recent times so but still I wish them the very best for the future to arrange such kind of events they surely work hard and we should you know phrase prism so we go today you know we're going to talk about REST API with cream so before that let me just give you a little introduction about myself so my name is Ann but I am a software engineer at cinder cones and M so basically I work in the fulfillment team that was formerly known as swimmed so we're gonna kind of not take care of take care of all the things that happen in our house as well as you know shipping things to other countries or people so you guys can follow me at to medium by the name under a little scores I don't forgot I right they often about my experiences and if you want to get in personal touch with me you can use my emails and it's oh so calm so today we're going to go I talked about creating REST API with great so you know before we move on I want to you know establish a videos basing understanding for people to know what reverse API is before so API stands for an application programming interface that actually helps us talk to other programs or other services on the internet or of things that and rest means its arrest is basically a convention to make them it explains that it states that our API should be self-explanatory and should tell what resources are very pressing anyone or what operation how we would like to perform you know the type of HTTP request determines the kind of operation what we know what we want to do you know every request every HTTP request has something called a verb or a method that determines its intentions so we have some standard methods as I get that which we can use to request request a certain resource forms from other service for example like movies this forward slash movies means you can call that and the other service would return you a bulk of data or trunk of data or some they are regarding movies so when you and there's another call post that we use to create some resource on the internet or somewhere else anywhere to update we use the put but we need to provide the specific ID of that resource that you want to update for example in a movie if you want to update its title you would be using a put request to update that similarly to delete certain certain resource we would use the same URL but the acid reverb would be delete that would state that to delete the the resource that we are requesting so as now we have you know covered what a REST API is and what goes into that so what creating them is a challenge you know there are few challenges to creating them before you start to think about oh I'm gonna make I'm gonna make some REST API you need to consider what format you would be using what kind of versioning would be you'll be using how will you be versioning API so you can be show of the backward compatibility because if you change your API and if you change the API and the existing users will be affected by by that change we have to consider the existing users that you see that are using your API so you have to virginia api's and you know you know entertain all the users new ones and as well as the existing ones so other things such as authentication validations of free programs are logging of he requests exceptions and so much more they are like many things to consider before we moving to creating REST API spot we have a solution it's called grape yes grape is basically a framework there will be framework so that helps us to make you know a recipe is by overcoming all these challenges you know providing very powerful features right out of the box so you guys can see or you know you guys can get read the documentation for this framework at this github link let me just quickly show you the way API this is basically the grave API the table of contents as you can see there are tons of stuff that you can do with your eye with this frame like the features it provides it's bonkers it's really nice to have so many features are out of box and it's it helps you you know wear them really easily and fast so more about grip framework is like as I said as I mentioned it's rest like API framework for goobie because it provides all the conventions that are and that goes into creating lists like applications it also provides a simple DSL to develop our who develop those KPIs DSL actually means our domain specific language what that states is that they have created a specific language using Ruby because we're a programming so we can use they have used Ruby to create another language but that's not what that language is not general purpose it's specifically target for doing specific things like creating useful api's so that's hence BSL so as I said more on it has built-in support for common convention as I mentioned foundations exception handling other tons of stuff so this was a general threat ik a little introduction to gravy API so I know you guys would be eager to move in to the code itself so we will do that but if we're you know diving into the code there is something Adson do so that we do before all the meetings we actually stand up and stretch a little so that you know if you helps us more you know a little get a little focused it helps us to focus more and make sure juice is running so I would like all of you appreciate all for you that standing up for just one mineral like less than one minute to just stand up and stretch your arms and your head she ate your head I'm gonna do it as well so it will be really nice it will be you know running your people at your van your juices so I hope you have stressed so I would you yep we're back so as I said I've set it up the set of the application beforehand so some resources I've also just data Skyfall offer a resource for movie I would go ahead and I will just show you guys how would this look this is the sample application that I have so and we're back so first off first off just I'll be going into my gem file and I will add to gem have the gem crepe and do a bundle install volatile er added and bundle installed into my application so I won't you know time so you guys when you are you know integrating it I go ahead and Oberon install as well as don't forget to research application we saw this over so before I begin you know so how we are talking in terms of rails how we get integrate in Wales the qwave so first of all we need to tell we need to namespace that application inside our rails application so that we know that it's separated from our other other code base so I'm gonna go ahead and just create a simple simple sweatery inside app by the name API yep so I'm gonna go ahead this this more to that this is that this would mean we would tell Rios that our API functionality is this resides in this folder so I'm going to go ahead and create another directory by the name you know you can you've named anything this would be the application that we are going to develop so I'm gonna just go ahead and name it grapes because the like grapes jump yeah so this is the namespace this is the all a domain that our API application will live in so further begin I would just create simple you know simple at possible file called API nor RB yep so this would be the you know the base class the fundamental class we would be working in this would be the class that will be interacting with you know all the other API is that you create that you would be creating in this those ApS in this file or at least connecting them or integrating them in in this file so I'm gonna go ahead and simply write a module called crêpes mm-hmm because this is the name of our names we're so forward so I'm gonna go ahead and click create a simple API class that would be inheriting from grape API API class so this would mean just like application controller or application record we would be creating our API class all right so this way I would like to stop here and move towards another thing that we need to address full dining in we need to tell rails how to connect the routes that would be coming in into our application and forward them to the crêpes API API application so I'm going to quickly open up my mouse file and I'm going to mount the grape endpoint that we are mounting hi inside wheels app so I'm going to use the function mount and I'm going to tell which you know API to hit happy API application to mount so are we using this and how we need to tell the route to which eggs and mount the API ropes so I will just use the route route for that so this is we gonna do in the inside the dogs files we don't need to go ahead any you can disclose it if you're starting going along with me so as I said in the presentation that there are tons of things that you know you may provide us in terms of features like versioning our api's formatting the you know other validations and stuff so we're gonna go ahead and use some of those features that apply to the API framework or the pre-application on the high level something like what format are we going to use for our api's we're going to use JSON format for IEP eyes so choose me so another thing that we want is that to differentiate our routes you know simple application votes from our API routes so I'm going to use the prefix method that would tell rape to you know she was the prefix API for anyone you know in the store if any dog and the same goes with the version I'm gonna use a version method and provided we won because this is the first version go for API and hopefully there would be other versions and then when you specify on the motion they are multiple you know techniques that you can provide version information you can use the URL path you can use the headers maybe or you can use any other thing they are three to four three to four excuse me you can make use multiple options so one of them actually so I'm going to use a simple option that is you know familiar with everyone I am you don't you can use the path option yeah it's it's very simple as you can see this is the as you can see these are just simple function calls that will it reduce your work like a lot so I'm gonna go ahead first I'm going to go ahead and change the font size for my editor you you you you you you you you okay so yeah I hope you guys can see the font size right now it's much bigger okay so I've been to you're going to continue now so now the basics of our application is there mmm rails knows there is an API application inside you know inside me and we have set up basic structure of the fundamental structure Babel that could be used as you know API of API so now let's go ahead and create some you know api's I'm going to go ahead and create so for this app I've just you know as I said I have scaffolded a website scaffolded some model called movies so I'm going to go with that and I'm going to create a file by the name movies Robbie now I would specify yeah we're going to get movies from this app yeah so so we're going to write going to start ahead providing the bare bones for this for this you know module so I'm going to go ahead and write the basic stuff because we're inside the v1 module yep so now the real thing that comes in that be our making movie class to serve the movies so it's also been to going to you know inherit from our crepes API we just created crepes API we just come in at it is from here so moving on there are as I mentioned in the presentation there are several basic way you know there are several things that goes into creating restful services restful api there are certain verbs that maybe need to handle like get post put and delete they all means they're really going to get some resources or we going update or i delete some resources so first off you know what we're going to do is PR this is the bare-bones and we not we are not going to jump in you know Starion are creating our FBI's been going to follow an approach go 3d test-driven development that means that dictates that we should why not test beforehand before they actually dive into our code so that would mean we are writing writing tests to you know or in our application also it helps as the proper documentation for i for i and itself what you can expect from an application so i'm going to go ahead i have side note i have integrated r-spec you know in this application sample application and we will be writing request specs as you can see I have folder by the name of crispix and I have a file over already there so that we're going to write some tests inside of a first and then we're going to create that API so this would be first test and then code to test if our I know code is passing or not go ahead to first off the most basic the API would be would be to get you know some resource get some movies from from from our server you know we won't expose an API that could send that would send some movies back to the user so this will be privy to user describe block that would actually cry about the cat movies namespace or named API i hope i'm this is no prerequisite for this thing that you are somewhat familiar with r-spec and are you comfortable with the you know testing and stuff so I'll be explaining some of the test terminologies in this so even if you have any questions so let me just comment it out and I'll definitely get back so first test should be that we are you know before writing you know tons of tests I think step back in think what kind of you know scenarios or what should be the scenarios you want to test in your application so if I am requesting a tons of movies from like so many question from my application it should at least give them a proper response status status code as well as the you know the movie itself movies itself so these are you know to at least basic things that my API should do so I'm going to go ahead and right our forces that would you know give us you know that would confirm that we are returning a proper success code for to our user so it would say something like you know returns returns success code and so in in our request backs we actually are able to you know request to our mimicking request you are that URL so if you can see the hybrid well it actually adds some of the you know methods that would help us doing that something like get the get matter would actually perform a get request on any specific URL that we pass it so in this case we have API we man the version prefix version and then our movies resource I hope that makes sense to all guises or if not feel free to post any comment and I'll get back to you in Seoul so well when we are testing we are expecting right we are expecting something from the API so I'm going to do the same thing I'm going to expect that my API should return something so in the request back we have you know aspect makes response variable or response method available to us after we have requested or you know made requests to some route call URL so this response would contain something hopefully so there's a method call to that expects that may ensures that they should match to some other criteria so I'm going to go ahead and I write I'm gonna expect against some case B status and I'm going to expect that our API the movies API give us the 200 so I'm going to go ahead and test it within my only mine edit your ID how did you run it and for sure it would it should fail because we have nothing to support no code base to support it and it should fail all right as expected it should fail because it says that we don't have any API v1 routes so what we're gonna do it's very clear so what we're going to do we are we're gonna make API or a simple route to support that so to do that it's very straight we used some conventions there are various really similar to Wales so in terms when we specify any applicant it out in our routes file so we use the resources method that would create some routes so similarly we would use the same same method inside great and positive block so now this means that we are going to create something so now at least we're going to go in into our test and I'm going to run it again because we're draw now we have a route but it should still fail I hope you guys can see that yeah it tests fail right as expected I'm gonna go ahead still because they are no crowd Suki to that so I'm going to go ahead because we are you know going for the get API v1 movies route so it would be alright so we're going to use feel and recording it is it's very intuitive and easy diesel to learn get get means I'm going to perform or this should run this block should this thing should run when we have a get request so I'm going to pass a block to it and to be honest this is our API for you know for getting all the movies for the this route and whenever this good routes gonna come in request great is going to match and want this for us so what should be there when we you know when what which really will be done so it's where you should go we should return all the movies because this is such a simple application level this thing would do so another thing in our group that great provider is that didn't document to our API is by using simple methods call the ESC description so we can actually write some simple description I'm going to say return all movies right so anybody who reads that he knows okay this is for returning all the movies so I'm going to go ahead and run this again okay it's saying it loud oh yeah so right see you whenever edges of writing test can actually help you identify the box that you are joking you were going to introduce which we have so what they forgot is you child rape that do we have this resource that you need to insert into so we integrated into yourself so we just go right back so we're going to use the function mount again and we are going to add crepes we won and we're going to add movies so now crab is aware that we have something called the movies a resource see this is the advantages of writing tests first so this is saying that we have grapes we've an undefined Crips we one we do have grapes we want and okay I'm just gonna go ahead and I believe this is do do I have increase re Muscovy let me just restart it to make sure everything is fine yup it's it's showing us some matter alright let's investigate it initialize constant trips we won you have the creeps Oh see we forgot to add a v1 we want and we're gonna move this inside the we won so it would be versioned you know we can create another version simply get another folder and white another API so this is you know benefits of fighting t-tests first so I'm going to go ahead and press our server great I'm going to go ahead and run my test one more time and I hope this passes again and what I test passes so this was the first test that we would I'm going good I'm gonna go ahead and write another test that would actually you know match or expect against the value is very turning the movies that we're gonna return so is I'm going to write return all movies right simple description that tells what this test is all about so to do that first time you know then they need to be some movies you know in our database because we I think if you are there that we have different databases for test and development so when they would these tests one we are in a clean side the test mode and our test database would be used so I'm gonna go ahead and create a simple helper as simple you know movie you beforehand I'm going to explain it in a minute don't doing so what this means is that we are creating a movie inside a database this is actually as helpful as it provided us by our spec to create any resource inside the database in so I to resource actually to created a create an object that's it so the create Meryl is from the factory board gem that helps us create factories of data you know predefined data sets or predefined any object of some data object of some class right now we have a movie class I'll show you so I have defined a simple factory over here that its name is movie it has titled waiting and URL so this is another term called figure that keeps us gives us fake value so every time which it is you know every it returns us a different random values so this thing actually does what this thing does is it's actually created it creates a database object it creates a movie object into our database test database and stores it stores it inside this movie variable so what's different about the difference about different about to let this method and I've let bang means there are two versions to this method let and let a bank the bank sign then what this does is it actually creates a variable called movie but it won't actually you know it would execute it unless or until we have used it to let does that but with the bank sign what it does it makes this variable available to us before every you know example one this thing is called an example it would be available to us before every example so I'm going to go ahead and as because our spectrum shows that other is going to run before our you know example so I can actually expect that we have something in our database so I'm going to go ahead and request all the movies inside a test database and slowly into movies and I'm going gonna go ahead and request the same URL and I'm going to expect that the response our body should contain you know to be equal so you know movies should we could remove is but as we are dealing with the JSON data format this would be the body the movies inside the body would be encoded into JSON encoded actually so we need to charge them using json dot parse this will actually or the ad we need to convert just to json first to encode it to make it in json encoded string and then on here we going to it's gonna do the same with this right so moment of truth we're gonna run the test and let's hope it passes all right so this means our test has Paris and our tests are successfully returns or success code as well as body so to make more things or I know more visually appealing I'm going to go ahead into postman and it requires the same URL and see what do we actually get so we have a local ski thousand API v1 movies we have the get method and I'm going to go ahead send a request to and yes as you can see we have all the data that is in our database so this was our you know one API we actually congratulations via well actually able to test our first API data turns all the resources but there are more api's to do it so I'm going to go ahead and go ahead and create one more API for you guys so it would be to get a specific you know movie you know we're gonna pass in some ID and it's gonna turn that specific movie so before that I'm going to go ahead and create that movie method this actually could be you know refactoring to refactor into I'd actually to use just once and we can declare that on the top but for this example I'm going to go with you know the non dry approach so you guys can actually familiarize yourself with the beginners who was joining joined us I can't familiarize himself with r-spec so I'm going to go ahead and create one more movie and so this will be able to us beforehand right so I am test so I'm going to test something that what if our service is hit by a certain request that contains an ID that we don't have like we don't have we have five movies I think so that means if if passed along the ID we should return a 4-fold status for and invalid ID all right makes sense so I'm going to simply go ahead and pass make a get request to the same same you will but this time you know provide you know invalid ID and I'm going to expect that our TV response I have you sponsored some justice fault I'm gonna expect the response should have the I you know for for HTTP status so so I'm going to use the function have HTTP status I'm going to use 404 so right now we haven't develop any API for getting a specific movie so so clearly it's gonna fail yeah as expected it actually you know field so this was our first API I'm gonna go ahead and use the DSC DSC function to describe that our API returns you know specific movie so [Music] in this FBI this specific API we are using a router m-maybe ID or maybe something movie ID something like that so we need to tell you know great that we will be using some parameter inside of our function the API so how are we going to tell that we're going to tell the wave by using a function called dot for em and we're going to specify what kind of parameter in the URL we're going to use to actually identify the movie and I'm going to provide its type it's going to be it's going to be integer and I'm going to pass simple blocks way so the benefit of using this kind of block is that we tell that hotel a grape that we're going to use the ID forever in our URL and it's going to be an integer so what this type does is it's actually also validates against the type of that ID of that traveller if for example if we are passing some word maybe hello world you know in our ID so it will actually go ahead and validate that is it an integer or not and it's going to fail it's going to pass or return a validation error to the user so let's go ahead and just define on a basic API so it means that it should you know give us an error when by the years also I'm going to go ahead and use a function you know error handling function provided by crêpe and pass in something where I could not found and I'm cool I'm going to pass a 404 error because I we are expecting this thing to not test because if we pass something it's going to fail with this this is the parameter this is the scope of our test that it should you know pass and we need to satisfy our test cases nice ass because it's expecting you four or four and we actually are providing it for four now I'm gonna go ahead and write a simple test that actually returns you know our API are simple so I'm gonna go ahead and make a return specific movie all right this is what our test is expecting that it should return specific movie I fee at the API we have the movie we can use this movie ID if you want last week we're gonna go ahead and see how this moves long so I'm going to use the movie ID that we already have in the database should return that movie so I'm gonna expect against that we expect just more cars as far as that body it should contain because once we have parsed it I'm expecting that this should contain a field by the name movie and and inside a movie there would be a field name title and I'm going to expect that it should be equal to you know movie dot title because we are requesting that same of each should be equal to that as well so I'm gonna go I'm going to go ahead and run this one more time because it's going to show you that it would fail yep it failed because it has nothing inside you know the body seventeen so I'm gonna go ahead and write a very simple fine call find crams as you can see I've used the prams function it's it's grave also provides us the same function trams as real stars so right now what we're going to do is if right now it's going to produce another right it's going to find the movie and it's you know it's going to throw an exception that we really don't want we only want that in case we have an edit and we're going to rescue it we what kind of error should it would it be recognized found a rocket not found if there is a recognized founder I wish only in that case we should you know through an error right so I'm gonna go ahead and run my test again it still says that it failed right we have that half right over here then of how able to find that way to find prams ID let's it saying that it does not have anything inside it all right well I am going to make a simple hash that would actually contain movie object yes because it's and it's going to as a movie right those we are expecting a movie inside the our JSON responds and tile inside it so we have that Jason on a kind of a hash we would translate into a JSON object so a movie in and it would have that thing yep and it passed so so far we have created our to api's and good specs throughout it so right now due to time concerts I'm going to go ahead and you know do some develop a live api's and test on a faster speed and I but I'll be explaining that to you guys what's going on right so we're gonna go ahead and just I'm gonna go ahead and copy some of the tests that I wrote earlier to save us some time so right now we need we are testing the post request to create a movie so what our params made is I have created the prams method or variable to contain us hash of this this ash and use the context blocks our context box and describe blocks are exactly the same they're alias of each other but the name the convention use is far different we use context to actually literally define context in our test cases so this context is going to test valid parameters if you're passing value families parameters and this one I've been going to test if there is no provider whatsoever so I'm just going to you one the valid ones first to show you that it would fail yeah so yeah we know how it failed so we know that we haven't you know developed law API yet so I'm going to go ahead and quickly spin up t appear so description method as same as above what different here is this param block right so this pram lot tell script that we would be using these three parameters in this API and one of them is required so Dre would know to validate that when the request comes there and the other two are optional we don't need the URL and waiting and we have defined the types our tributes types should be add p.m. also added another step another evaluation rule that won't allow it to be black won't allow title to be black and as we use the get function above in our api's we will choose post as defined in the rest conventions they were using a post request so when the request comes in we going to create a movie and with those friends right now you can see a declared method what this does is it's provided by clip and what this does it it actually filters out filter out all the parameters that we haven't provided so declared Effie a pass or pram should clear it will filter out all the variables that were there are here and passed to are a return it actually so we can use it anywhere so for example if we have passed a variable apart from these I like for example some song or cast link so that won't be passed to our movie you know model so once we are done with that so once it passes out the parameters to move model so we can go ahead and save that into a variable and success successfully you know they send out a message so I'm going to go ahead and I'm gonna go ahead and test out this into a movies back I'm going to yeah how long do you run this valid huh yep run the so yeah we have clearly pairs or spikes with those with that so I'm gonna go ahead and explain to you about how we're going to test the negative scenarios in this case when to test our validation rules so as as you know we have declared of prams variable of the world now we're going to make that an empty because we only test about test that that we should not allow blank values inside our movie model so I'm going to go ahead and pass that I request the post you will with along with our friends and I'm going to expect that our body should contain an error and it should be the message should be title is empty right I'm going to go ahead and just one because the code is already there I'm going to show you so yeah it pass so we have been you know coding a lot so I'm gonna go shift towards the postman to test our appears as you know as you can see we have a few movies created so I'm going to request the first one I'm going to depress it and let's see this and yes our API works we have a moving object movie object and it hasn't value it has some values right so I'm gonna quickly go ahead and test out our new API that we just created about the post to create new API so how you actually go ahead and test postman is that you respected worldwide appropriate method the URL and come inside body and use the raw option so you can you can define all the variable inside that so I'm gonna go ahead and define and I'm going to say how yep so I'm gonna go ahead and request let's see what happens this oh yeah I forgot uh come on uh so I'm gonna go there and yep my movies created as you can see new movie by the name you are reading nine and so URL and as clearly defined message that our movie was created right so I'm going to go ahead and test out I for validation works not so I'm gonna skip out remove the title at Yahoo that was actually the file and see so it's saying that title is missing and title is empty and I'm going to pass some value so blank value so it actually does not create it so I'm going to go come here and request that and yeah I new movies there so so so far we have done a queen and forget and uh trading IP eyes so I'm going to go ahead use the the update API so we can actually update our resources it's very similar to our you know host api's very simply I have we use the same you know context to separate the valid friend versus invalid friend and a new thing that I wanted to show you here is that like we declared movie friends and the above test so you guys can refactor that using rather than writing you know hash like this you guys can use the I know factory method that factual provides ads for attribute for this actually turns a simple hash right this just returns us a simple hash that we can use so it I have dried it you guys can also use this in are you doing in your chest you make your test modes why so yeah we're going to cover the this first if we have developed ramp that means we have Tyrell we have other things so it's going to update our API star movie resource and return us you know message success message in case of invalid trams how we done going to say that we are going to delete the title attribute first to test the validation and secondly we're going to update its value to mail so you can test the allow blank foundation in it so I'm going to run the entire scribe block so we move it faster yeah so it failed as expected so we're gonna go ahead and quickly you know copy the API for update so as you can see this is almost identical to post as far as the params often is require our prams is concerned and we are using the restful method point to describe to tell you if that any push press will update or should we do it would be directed to this block so you are you're going to see that I've used vodka as my english isn't a Shania you know I mentioned I talked about when we going to use pot or a bit some resource we need to provide the ID to identify and find that resource so we're going to tell web that an idea would be passed into the route and you just give it a toss right so as you can see I have used you know negative sorry I've catered negative negative scenarios if we don't get an ID and we don't find you know you know we saw some movie but if be too we going to update that and if we don't be going to 1 into validation errors so I'm going to go ahead and one my specs so yeah hit past so we can quickly coming to postman and I'm going to update a certain resource by the name you know movie one to movie one I'm going to name rename it to hello world so we updated successfully if I don't provide any it's going to give us the error and it's same if they remove that so this is uh so we have so far we had you know done or created three a kind of API is in our thread application only really is the utility API so on so to say stay consistent I'm going to go ahead and quickly copy those things so for delete I have just two cases are valid the ID ID or invalid ID in case of valid ID we would actually delete the resource and send out a message called deleted successfully and if not we will be you know returning error message that we didn't find any packet so I'm I'm going to run that then obviously it could fail so yeah I'm gonna go ahead and quickly write the api's lydia pia it's very similar to what we have done so far Roslyn that describes the ID that you can provide the type over here to validate and the more important thing is delete a shooting vogue method that we would use to challenge wave that to route all the delete or a request to this block right I'm gonna go ahead and run our test specs one more time I'm gonna go controller wrap this up yeah so our API works so let's quickly go into postman and lead the number one movie movie with the ID one yeah movie delivery successfully so now I'm going to test like if it really delete it or not so as you can see there is no ID in number one movie with us so that means IEP I suddenly works fine as we have proved the test over here so so this is this was you know all the API is that we needed to make for a credit application to support our cred IP ISO so this is the functionality that gives us as you can see we haven't you know it's it's it's not a big file it's just around 5060 lines of code and you can actually create a credit application well you know about credit application if you guys with that and still right now it's not very dry you can use tons of other things into the if you're going to talk about it should not have barely scratch the surface there is too many things to explore I would love if you guys would it go ahead and explore this on you on because I because I have given you you know a basic intro so you can get up when you are up and running using wave and explore them you will find it very powerful because of its features and the flexibility is actually gives us so you can actually if we go into the advanced thing you can actually you know dry most of your code over here and put in somewhere else so it would actually come up to like 20 or 30 lines of code you can go ahead you will see use difference when you do that so I hope you know after going through this and seeing the power of the grave that it provides you make a is felt good at least I you know felt you know very good about that there are tons of other stuff that you can do you know paramedic documentation you can read you like you can explore thing do more things in raising exceptions so so after that you will be feeling so good you know that the feeling I had when I when I you know created my yes I was like oh very good it saved me a lot of time so you guys should explore this one even I would really appreciate if you have any questions so put that in you know the comment section I will definitely get back to most of them inshallah so so this says this experience has been really good I highly appreciate you guys you know coming in and I will definitely see you next time thank you for you know tuning in please do give me feedback if you're going to follow me follow me on medium and thank you for your time call office you
Info
Channel: RubyConf Pakistan
Views: 1,294
Rating: undefined out of 5
Keywords:
Id: xKj4-njCe9w
Channel Id: undefined
Length: 70min 21sec (4221 seconds)
Published: Mon Apr 20 2020
Related Videos
Note
Please note that this website is currently a work in progress! Lots of interesting data and statistics to come.