I’m using Shippinglogic to gather tracking information for submitted tracking numbers.
I’m handling a number of things behind the scenes of the UI, but I’m not sure how to properly organize this.
So here’s the flow:
- User submits tracking number either via form input or URL (example.com/track/1234567890). If the number doesn’t already exist in the database, then the next step happens…
- After a number is submitted, I run the number through some logic to determine who the carrier is (UPS, FedEx, USPS, DHL, etc). The user never specifies…it’s all done automatically.
- After the carrier is determined, then I need to make the actual call to the carrier API (via Shippinglogic) to get tracking information.
- After I get the tracking details, I need to save it to the database.
- Then, the tracking details are finally returned to the user.
Since users can submit either via form or via a URL (without any sort of POST action), I’m trying to run it all through my show method in the controller where I check if the number exists and if not, submit it via Number.create(:tracking_number => '1234567890') but once I get into the model, I just kinda get lost on what to do next.
Well I would have the users directed to the new or create actions where you can handle creation and detect if the record already exists. Once that’s handled you most likely want to send them off to the show page where you can display the tracking information from your data source and any information you have saved in your database. This way you are preserving the nature of the application and other developers would be able to work with the application if they need to.
Edit:
I had a project like this and I move my detection code out into a separate function inside the model so I could make changes to it and abstract it from a specific call on the model. I performed my API requests in the background on the model so I could cache data in the database and refresh the records that were deemed active once an hour.
Basically if it needed to use the data from the record or save some data as part of the record I made a function in the model. This enabled me to split a bunch of functions out from specific modifications to controller actions and the like.