Git Product home page Git Product logo

renegadebio-staging's Introduction

Ruby On Rails Vite Ruby Vue.js

An example Rails 7 app

GitHub license

This app is using Rails 7, Ruby 3, Vite, Vue 3 and typescript You could use this example app as a base for your new project, or as a tutorial that tells you which steps you need to start a project from scratch

This example app includes some gems and packages that I'm using them for a long time. it wires up a number of things you might use in a real world Rails app, but at the same time it's not loaded up with a million personal opinions.

  • As Webpacker has been retired, we are using Vite instead. And it's not fair if I don't say this: Vite is incredible.

Tech stack

I used rails new renegadebio -c tailwindcss -d postgresql command to init the project to have based on importmaps and default configs, but I removed importmaps and tailwindcss and all default configs and moved to using Vite instead. You can see the list of gems that exist in the project with the link of the related commit, so you can easily find what we configured for each gem.

Note there is a commit/branch for each gem/package and adding/changing a code in the repo, and you can see the list of the steps we did in order at the below. e.g. step 1 in the repo was init project and using PostgreSQL. step number 2 was adding RSpec, etc.

Back-end

Front-end

  • 17- Vite Removing importmaps and all frontend libraries and Use Vite instead (PR)
  • 18- Code quality and format (Check Healthy app/Frontend part)
  • 19- Vue.js Vue.js version 3 (PR , PR-fixbug)
  • 27- Enabling auth process(and make the app ready) which needed more packages PR:

Healthy app

Frontend

Backend

  • 7- RuboCop Code quality and format. First I added rubocop-rails_config gem by these two commits (commit1) (commit2), but after a while, I removed this gem and added rubocop gem and its extensions separately in this PR

  • 20- Brakeman Checking Ruby on Rails applications for security vulnerabilities. you can check config/brakeman.ignore to see ignore errors (PR)

  • 21- bundler-audit Patch-level verification for bundler (PR)

  • 22- Fasterer Make Rubies code faster by suggestion some speed improvements. check .fasterer.yml to enable/disable suggestions (PR)

  • 23- License Finder Check the licenses of the gems and packages. you can update doc/dependency_decisions.yml to manage licenses (PR)

Common

  • 24- overcommit to manage and configure Git hooks by managing all healthy app tools. you can check .overcommit.yml to enable or disable tools. (PR)
  • 25- Enabling github action to run overcommit after push and pull requests in github. Check .github/workflows/lint.yml to see the github configs (PR)

Auth

We are using JWT to authentication using Devise and Devise::JWT gems. If you send a request to log in, the successful response will give you a header called Authorization which has the JWT token as value. and you need to add this header and its value to all of your requests.

Predefined auth routes:

/signup

Request:

curl -XPOST -H "Content-Type: application/json" -d '{ "user": { "email": "[email protected]", "password": "12345678", "password_confirmation": "12345678" } }' http://localhost:3000/signup

Response: Returns the details of the created user

{"data":{"id":"4","type":"user","attributes":{"email":"[email protected]","sign_in_count":1,"created_at":"2022-04-18T17:49:06.798Z"}}}

/login

Request:

curl -XPOST -i -H "Content-Type: application/json" -d '{ "user": { "email": "[email protected]", "password": "12345678" } }' http://localhost:3000/login

Response: includes Authorization in header and details of the loggedin user

HTTP/1.1 200 OK
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 0
X-Content-Type-Options: nosniff
X-Download-Options: noopen
....
Content-Type: application/vnd.api+json; charset=utf-8
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0Iiwic2NwIjoidXNlciIsImF1ZCI6bnVsbCwiaWF0IjoxNjUwMzA0MjU3LCJleHAiOjE2NTAzOTA2NTcsImp0aSI6IjM4ZmI4ZGIyLWVlMjgtNDg2Yy05YjE5LTA2NWVmYmQ0ZGE4MCJ9.p8766vPrhiGpPyV2FdShw1ljBx2Os3D1oE_rPjjAYrY
...

{"data":{"id":"4","type":"user","attributes":{"email":"[email protected]","sign_in_count":2,"created_at":"2022-04-18T17:49:06.798Z"}}}

Login

/logout

Request: includes Authorization and its JWT token in the header of DELETE request

curl -XDELETE -H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiI0Iiwic2NwIjoidXNlciIsImF1ZCI6bnVsbCwiaWF0IjoxNjUwMzA0MjU3LCJleHAiOjE2NTAzOTA2NTcsImp0aSI6IjM4ZmI4ZGIyLWVlMjgtNDg2Yy05YjE5LTA2NWVmYmQ0ZGE4MCJ9.p8766vPrhiGpPyV2FdShw1ljBx2Os3D1oE_rPjjAYrY" -H "Content-Type: application/json" http://localhost:3000/logout

Response: nothing

Logout

Note We are using JWT to authentication, it means you can use this Rails base app as a vanilla rails app (Backend and frontend together), or as a Rails API app. both you can use.

Apps

I always prefer to have two apps for my projects, one for the part that will be shown public (I called it Website), and the second one for the part that you are managing there (I called it Panel), simplify you need to log in to have access there.

If you can check the codes you can see that there are two layout view files and two actions in application_controller, and two routes in routes.rb file. and for frontend there are two different entrypoints and routers ane etc.

In this case, you can use different technologies and UI Component Libraries in frontend, e.g. use Vuetify for Website and use VueTailwind for Panel. or even (it's a bit headache) but you can use React for Website and use Vue.js for Panel.

Two simple html/css templates have been added for Website and Panel. you can remove them easily

Website and Panel preview

Running this app

You need to do few small steps to run the app

Clone the repo

git clone https://github.com/zakariaf/rails-base-app renegadebio
cd renegadebio

Copy example file

cp .env.example .env.local

Environment variables defined here(.env), feel free to change or add variables as needed. This file is ignored from git (Check .gitignore) so it will never be commit.

If you use different values for environment variables in other envs, e.g. test, you need to copy one more: .env.test.local

Note .env.test is used by github workflows.

Setup the project

create databases

rails db:setup

start the project

  • rails server

    rails s
  • frontend app

    yarn dev

Renaming the project

This app is named renegadebio and the module is named RenegadeBio. But for sure you would like to have a different name.

The only thing you need to do is just running the bin/rename-project yourappname YouAppName script. as you see this script needs 2 arguments:

  • First argument: The lower case version of your app's name, such as myapp or my_app depending on your preference.
  • First argument: Used for your app's module name. such as MyApp

bin/rename-project myapp MyApp

This script is going to:

  • Perform a number of find / replace actions
  • Initialize a new git repo for you (Optionally)

After that, If you're happy with your new project's name you can delete this script.

Or you can keep it around in case you decide to change your project's name later on.

I got the rename script idea and codes from Docker Rails Example project with some small changes.

TODO

  • Add cypress
  • Dockerize
  • automatic deploy process using capistrano
  • add .gitlab-ci

renegadebio-staging's People

Contributors

eric-norcross avatar rchesnavage1992 avatar milesrae avatar rchesnavage23 avatar

Watchers

Kyle McClain avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.