This article was written by AI, be forewarned that it may not be 100% accurate for your purposes, but it did work for mine. Let me know if you see anything that needs to be corrected!
Building a Sinatra CRUD App for Recipes with SQLite3
Want a simple Sinatra CRUD app for recipes? This guide walks you through setting up Sinatra, connecting to SQLite3, and creating routes for basic CRUD operations.
Setup:
- Gem Installation: Install the required gems:
gem install sinatra sinatra-activerecord sqlite3
- Project Structure: Set up your basic directory structure:
/myapp /models /views /public app.rb config.ru Gemfile config /database.yml
- Gemfile: Add the required gems:
source 'https://rubygems.org' gem 'sinatra' gem 'sinatra-activerecord' gem 'sqlite3'
Then, run bundle install
.
- Database Configuration (
config/database.yml
):
development: adapter: sqlite3 database: db/development.sqlite3
Model:
Create a model for your recipes (models/recipe.rb
):
class Recipe < ActiveRecord::Base end
Migrations:
Generate and run a migration to create the recipes
table:
- Generate:
rake db:create_migration NAME=create_recipes
- Define the migration (
db/migrate/[timestamp]_create_recipes.rb
):
class CreateRecipes < ActiveRecord::Migration[6.0] def change create_table :recipes do |t| t.timestamps t.datetime :deleted_at t.string :name, unique: true t.text :content end end end
- Run the migration:
rake db:migrate
Sinatra App (app.rb
):
Here's a stripped-down version of your CRUD operations:
require 'sinatra' require 'sinatra/activerecord' require_relative 'models/recipe' # List all recipes get '/recipes' do @recipes = Recipe.all erb :index end # Create a new recipe post '/recipes' do Recipe.create(params[:recipe]) redirect '/recipes' end # Delete a recipe (soft delete) delete '/recipes/:id' do @recipe = Recipe.find(params[:id]) @recipe.update(deleted_at: Time.now) redirect '/recipes' end # ... [other CRUD operations]
Views:
- Listing Recipes (
views/index.erb
):
<h1>Recipes</h1> <ul> <% @recipes.each do |recipe| %> <li> <a href="/recipes/<%= recipe.id %>"><%= recipe.name %></a> <form action="/recipes/<%= recipe.id %>" method="post" onsubmit="return confirm('Are you sure?');"> <input type="hidden" name="_method" value="delete"> <input type="submit" value="Delete"> </form> </li> <% end %> </ul> <a href="/recipes/new">Add New Recipe</a>
- New Recipe (
views/new.erb
):
<h1>New Recipe</h1> <form action="/recipes" method="post"> <div> <label for="name">Name:</label> <input type="text" id="name" name="recipe[name]"> </div> <div> <label for="content">Content:</label> <textarea id="content" name="recipe[content]"></textarea> </div> <input type="submit" value="Create Recipe"> </form>
Running:
- Start your Sinatra app:
ruby app.rb
- Access the app via
http://localhost:4567/recipes
.
That's a basic walkthrough of creating a Sinatra app with SQLite3 to manage recipes. Adjust, expand, and modify it as you see fit, and happy coding!