- Pair, stage 2 project
- Due before class, Wed May 13
- Submit this project with a PR
A small community just created a Rideshare program for its local area. This project is to build a Rails app that manages that Rideshare program.
The community needs the following main pieces of functionality:
- New passengers and drivers can sign up for the service
- Passengers' and drivers' information can be reviewed and edited
- Passengers and drivers can be deleted
- Passengers can request and rate trips
- Drivers can see their aggregated statistics:
- How many rides the driver has given
- Average rating of all rides the driver has given
If this were a full production-ready web application, this app would support true user sign-in. However, this would require us to support authentication and maintain state to understand who (if anyone) is currently signed in.
Because we aren't prepared to support those features yet, it may be more useful to think of this application as an administrative portal, on which the user has access to all drivers' and riders' data. Further, whoever is using the application has the ability create rider and drivers and to "act" as any rider (ie. requesting trips and rating rides).
This project should demonstrate your ability to:
- Create multiple related Active Record Models
- Create models with validations and methods performing business logic
- Craft effective RESTful routing
- Work with a partner to create an attractive and functional Rails site
- Practice Agile methodology
- Work with a large amount of existing data in a Rails app
This project is meant to be exploratory. Take time to try to dive into each piece of Rails (routes, controllers, models, views). This project is built so that you and your team can create the waves yourself based on the dependencies of the requirements given.
Before you start writing any code:
- High five your team
- Discuss communication style/feedback style with your team
- Review the requirements with your team
- Create a Trello board
- Ensure all team members can manage the board
- Write and organize tasks/stories
- Prioritize tasks/stories
- Discuss who is interested in which tasks and any scheduling considerations
- What things should be done together as pairs vs individually?
- Create a diagram based on the data in the CSV files
Once the above is complete, this project:
- Requires a shared repo with all team members as collaborators
- Requires the team to create a Rails application which
- Conforms to Rails conventions on naming and inflection
- Is created by using
rails new .
. You will create a new rails app inside of the fork folder instead of creating a new folder for your rails apprails new .
will ask if you want to overwrite the existing filesREADME.md
anddb/seeds.rb
. Answern
to both of these (keep the existing file)
- Uses Postgresql as its database. (This should already be configured correctly if you followed our Ada Install Fest for Rails)
However far you and your partner get, the application should have, at a minimum, the following features:
- Seeded data in your database from the original CSV files (see below)
- Multiple related Active Record models
- RESTful routing
- A "look and feel" that will make you and your team satisfied
- Your application must have controller & model tests written
- Your model tests should include tests for validations, relationships and any custom methods
- We have provided a set of sample tests that you can use as a starting place for the
Driver
andPassenger
models. We have also provided a scaffolding for theTrip
model. You should feel free to adapt the tests to meet your design. - You will also need to write tests for all controller actions
- We have provided a controller test for a
HomepagesController
, which is a pattern we did not discuss in class. You are free to use this, discard it, or be inspired by it, as long as you sufficient controller test coverage otherwise.
- We have provided a controller test for a
- Use git relentlessly
- Pair program on difficult problems and to share learning experiences
- Don't leave deployment (optional requirement) to the last second-- it will take longer than you anticipate
- Business logic should be implemented in the model
- You will probably need nested routes, but avoid routes that are more than 2 levels deep
- Use semantic HTML
- Make good use of partial views
- Regarding validations:
- Validations are useful for making sure your database records are sane, and you should make use of them on this project
- It is easy to validate too much! If it's not a hard requirement for your app to function, it probably shouldn't be a validation
- If validations fail, let the user know why
We have provided some wireframes below; they are optional to use for executing layout. However, they should provide guidance for what views and information we instructors are expecting to see and interact with as we grade. We also have an instructor reference version of the application running. You can use this for reference or ideas.
Deploy your app to Heroku, and give it life online! Share the URL to the app in the reflection questions at the time of submission.
We have provided sample data for your site in the form of CSV files. These files are located in the directory db/seed_data/
. We have also provided a seed script, db/seeds.rb
, to load these files into your database.
db/seeds.rb
assumes a few things about how your database is set up:
- There are
Driver
,Passenger
andTrip
models - These models are related in a certain way
- The field names of these models match the column names in the CSV files
This is the recommended way to configure this project, but not a hard requirement. If you've got a good reason to change the setup, feel free to edit db/seeds.rb
accordingly.
This project has a lot of user stories, and it is likely you and your partner won't get to all of them. Here is our prioritized list of what's important for this project, based on this week's learning goals:
- CRUD operations on models with relations
- Creating new trips
- Model validations and reporting errors to the user
- Basic structure of a complex Rails app
- Complex business logic
- Driver earning and average rating
- Styling and design
Please use this list as you decide what to work on (or at the end of the week as you decide what features to cut).
Overall, write functionality, so that a user can easily and consistently navigate to other pages from any other page. Also, write functionality so that a user can understand form errors and correct them.
- As a user, from any page, I want to have a consistent, easily accessible navigation menu with different buttons/links. These links go to different pages that let me...
- View a list of all passengers
- View a list of all drivers
- Create a new passenger
- Create a new driver
- As a user, when I fill out any form in the site and the processing of the form submission fails, I want to be politely informed of what went wrong and how I can correct it
- As a user who needs to manage passengers...
- On the passenger list page, I want to click on a passenger, so that I can see that passenger's details
- On the passenger's details page, I want to be able to...
- See the total amount the passenger has been charged
- See a list of trips that passenger went on
- Click on an individual trip from the list of trips, which will take me to a detail page for that trip
- Click a link to edit that passenger
- Click a link to delete that passenger
- Click a button to add a new trip for that passenger
As a user who is adding a new passenger...
- I want to see errors and validations that show that a passenger must be provided a name and a phone number, so that I cannot make a passenger without name or phone number
- When a user deletes a passenger associated with a trip, it is up to you and your team on how to deal with "validations"/consequences surrounding the deleted passenger and the associated trip
- Don't worry about how a passenger's phone number is formatted
- When the user clicks a button to add a new trip for that passenger, use the following default values:
- A driver is selected automatically by the server. This driver should be available (
available
should betrue
) at the time of the trip request, and then should become unavailable (available
should befalse
) once assigned to this trip. - The trip starts with no rating
- For price of the trip, your program should determine the cost when the ride is assigned. It can/should just be a random number within some range.
- A driver is selected automatically by the server. This driver should be available (
- As a user who needs to manage drivers...
- On the driver list page, I want to click on a driver, so that I can see that driver's details
- On the driver's details page, I want to be able to...
- See the driver's availability status
- See the driver's name
- See the driver's vin
- See the driver's total earnings, as defined by the rules in the "Details" section
- See the driver's average rating
- See a list of trips this driver has driven
- Click on an individual trip from the list of trips, which will take me to a detail page for that trip
- Click a link to edit that driver
- Click a link to delete that driver
As a user who is adding a new driver...
- I want to see errors and validations that show that a driver must be provided a name and VIN, so that I cannot make a driver without name or VIN
- I want the new driver to be available by default
- The driver gets 80% of the trip cost after a fee of $1.65 is subtracted
- When a user deletes a driver associated with a trip, it is up to you and your team on how to deal with "validations"/consequences surrounding the deleted driver and the associated trip
- Don't worry about how a driver's VIN is formatted
As a user who needs to manage trips...
- When I am on a trip's detail page, I want to be able to...
- View details of the trip
- Assign a rating (1-5) to the trip, if it does not already have one
- Click a link to the detail page for the trip's passenger
- Click a link to the detail page for the trip's driver
- Click a link to edit the trip
- Click a link to delete the trip
Homepage:
Add a Driver: (Only include the fields required by this project)
Drivers List:
Driver Show Page: (Only include the fields required by this project. Include the driver "Available" status.)
Add a Passenger:
Passenger List:
Passenger Show Page:
Trip Details:
You can find what instructors will be looking for in the feedback markdown document.