From 1a3a4287b00acc054b1ef07526a569cd4b504939 Mon Sep 17 00:00:00 2001 From: James Dinkel Date: Thu, 28 Dec 2023 00:13:50 -0600 Subject: [PATCH 1/3] Getting ready to use database --- Gemfile | 6 ++++++ README.md | 4 +++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 3606de8..6e8b26c 100644 --- a/Gemfile +++ b/Gemfile @@ -4,6 +4,12 @@ gem 'roda' gem 'rack-unreloader' gem 'tilt' gem 'erubi' +gem 'sequel' + +# Change to whatever database you plan to use +gem 'sqlite3' +# gem 'pg' # will also want gem sequel-pg +# gem 'mysql2' # change to gunicorn or passenger if you prefer: gem 'puma' diff --git a/README.md b/README.md index 83f577f..e8d83d1 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ For the single file app template, really the only file you need is the config.ru and run it with puma. +## Database + ## Views In this template, I've taken the single-file template and split up the config.ru to put routes and app logic in app.rb and call on templates to render proper html pages. `tilt` and `erubi` gems are added to do the rendering, and `rack-unreloader` gem is added to have puma automatically load file changes while running in development mode. @@ -21,7 +23,7 @@ Will need ruby; install it via package manager or a ruby manager like rbenv/ruby With this example, will basically just ignore the project's Gemfile. Debian 12 has a pretty current ruby version so just using it. ``` -sudo apt install ruby ruby-rack puma ruby-erubi ruby-tilt +sudo apt install ruby ruby-rack puma ruby-erubi ruby-tilt ruby-sequel ruby-sqlite3 sudo gem install roda rack-unreloader ``` From bffbab8fbc8e0691f3d8375531a32ddb597d1edd Mon Sep 17 00:00:00 2001 From: James Dinkel Date: Thu, 28 Dec 2023 18:36:49 -0600 Subject: [PATCH 2/3] Added sequel with example setup --- Gemfile | 1 + README.md | 2 +- Rakefile | 33 +++++++++++++++++++++++++++++++ config.ru | 3 ++- db.rb | 4 ++++ migrate/001_create_users_table.rb | 11 +++++++++++ models.rb | 14 +++++++++++++ models/user.rb | 3 +++ views/index.erb | 2 +- 9 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 Rakefile create mode 100644 db.rb create mode 100644 migrate/001_create_users_table.rb create mode 100644 models.rb create mode 100644 models/user.rb diff --git a/Gemfile b/Gemfile index 6e8b26c..b668a39 100644 --- a/Gemfile +++ b/Gemfile @@ -5,6 +5,7 @@ gem 'rack-unreloader' gem 'tilt' gem 'erubi' gem 'sequel' +gem 'rake' # Change to whatever database you plan to use gem 'sqlite3' diff --git a/README.md b/README.md index e8d83d1..159cce8 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,7 @@ Will need ruby; install it via package manager or a ruby manager like rbenv/ruby With this example, will basically just ignore the project's Gemfile. Debian 12 has a pretty current ruby version so just using it. ``` -sudo apt install ruby ruby-rack puma ruby-erubi ruby-tilt ruby-sequel ruby-sqlite3 +sudo apt install ruby ruby-rack puma ruby-erubi ruby-tilt ruby-sequel ruby-sqlite3 rake sudo gem install roda rack-unreloader ``` diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..4a4ce07 --- /dev/null +++ b/Rakefile @@ -0,0 +1,33 @@ +namespace :db do + + migrator = lambda do |version| + require_relative 'db' + Sequel.extension :migration + Sequel::Migrator.apply(DB, 'migrate', version) + end + + namespace :migrate do + + desc "Perform migration up to latest migration available" + task :up do + migrator.call(nil) + end + + desc "Perform migration all the way down (erase all data)" + task :down do + migrator.call(0) + end + + end + + desc "Erase all data, then bring back to latest migration" + task :reset do + migrator.call(0) + Sequel::Migrator.apply(DB, 'migrate') + end + + #desc "Migrate to a specific version" + #task :migrate do |version| + #end + +end diff --git a/config.ru b/config.ru index 4e24994..1af6d15 100644 --- a/config.ru +++ b/config.ru @@ -3,7 +3,8 @@ dev = ENV['RACK_ENV'] == 'development' require 'rack/unreloader' -Unreloader = Rack::Unreloader.new(:subclasses=>%w'Roda', :reload=>dev){App} +Unreloader = Rack::Unreloader.new(:subclasses=>%w'Roda Sequel::Model', reload: dev, autoload: dev){App} +Unreloader.require './models.rb' Unreloader.require './app.rb' run(dev ? Unreloader : App) diff --git a/db.rb b/db.rb new file mode 100644 index 0000000..5c72eb9 --- /dev/null +++ b/db.rb @@ -0,0 +1,4 @@ +# frozen_string_literal: true +require 'sequel/core' + +DB = Sequel.connect('sqlite://temp.db') diff --git a/migrate/001_create_users_table.rb b/migrate/001_create_users_table.rb new file mode 100644 index 0000000..29d513d --- /dev/null +++ b/migrate/001_create_users_table.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +Sequel.migration do + change do + create_table(:users) do + primary_key :id + String :name, unique: true, null: false + end + end +end + diff --git a/models.rb b/models.rb new file mode 100644 index 0000000..33c6865 --- /dev/null +++ b/models.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true +require_relative 'db' +require 'sequel/model' + +if ENV['RACK_ENV'] == 'development' + Sequel::Model.cache_associations = false +end + +unless defined?(Unreloader) + require 'rack/unreloader' + Unreloader = Rack::Unreloader.new(reload: false, autoload: !ENV['NO_AUTOLOAD']) +end + +Unreloader.autoload('models'){|f| Sequel::Model.send(:camelize, File.basename(f).sub(/\.rb\z/, ''))} diff --git a/models/user.rb b/models/user.rb new file mode 100644 index 0000000..a4f2fa1 --- /dev/null +++ b/models/user.rb @@ -0,0 +1,3 @@ +# frozen_string_literal: true +class User < Sequel::Model +end diff --git a/views/index.erb b/views/index.erb index 4762d4c..31b3b2d 100644 --- a/views/index.erb +++ b/views/index.erb @@ -1,3 +1,3 @@

- Welcome to my new page! + Welcome to my new page! Running in <%= ENV['RACK_ENV'] %> mode!

From 14f1f3daa64dcdc56d6cdf2607da3857577f6055 Mon Sep 17 00:00:00 2001 From: James Dinkel Date: Thu, 28 Dec 2023 22:39:02 -0600 Subject: [PATCH 3/3] Added new views that use the database --- .gitignore | 2 ++ app.rb | 15 +++++++++++---- views/users.erb | 5 +++++ 3 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 .gitignore create mode 100644 views/users.erb diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cb44c0a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.rake_tasks~ +/temp.db diff --git a/app.rb b/app.rb index 76eeb17..8c321e0 100644 --- a/app.rb +++ b/app.rb @@ -14,10 +14,17 @@ class App < Roda view :index end - r.is String do |name| - @page_title = 'A Custom Greeting' - @name = name.capitalize - view :greeting + r.is 'users' do + @users = User.order(:id) + view :users + end + + r.on 'hello' do + r.is String do |name| + @page_title = 'A Custom Greeting' + @name = name.capitalize + view :greeting + end end end end diff --git a/views/users.erb b/views/users.erb new file mode 100644 index 0000000..13cc1e7 --- /dev/null +++ b/views/users.erb @@ -0,0 +1,5 @@ +<% for u in @users do %> +

+ Hello, <%= u.name %>! You're #<%= u.id %>! +

+<% end %>