Compare commits

...

2 commits

Author SHA1 Message Date
James 971c5f2233 Update readme.md 2023-12-27 19:09:35 -06:00
James 2151565e9c Split up config.ru and added views 2023-12-27 18:19:21 -06:00
7 changed files with 85 additions and 14 deletions

View file

@ -1,4 +1,9 @@
source 'https://rubygems.org'
gem 'roda'
gem 'rack-unreloader'
gem 'tilt'
gem 'erubi'
# change to gunicorn or passenger if you prefer:
gem 'puma'

View file

@ -2,6 +2,14 @@
For the single file app template, really the only file you need is the config.ru and run it with puma.
## 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.
My example html layout uses [Bulma](https://bulma.io/) to make it easier to make modern looking webpages.
Next Roda app template iterations will add database, then authentication.
## Setup
### Prereq installs
@ -13,8 +21,8 @@ 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
sudo gem install roda
sudo apt install ruby ruby-rack puma ruby-erubi ruby-tilt
sudo gem install roda rack-unreloader
```
#### Option 2: Bundler
@ -46,3 +54,19 @@ For development, just run it like that. For production, probably want to set up
### Run it with systemd in production
Copy the example myapp.service file to `/etc/systemd/system/` and edit accordingly. The example assumes a user named "myapp" with a group name "myapp", the application files are in `/opt/myapp/`, and puma is the system puma.
### Notes
## Unreloader
This has puma reload with any file changes while you are working on the app, when in development mode. When puma is in production mode, it loads the app on startup like normal with no performance penalty. It's very useful during development and no reason to not leave it in.
<https://github.com/jeremyevans/rack-unreloader>.
Basically, you require the app from the config.ru, and then within you app files, any "require_relative" will be "Unreloader.require" instead, plus you do need to include the file extension.
In config.ru, the `dev =` line stores true or false depending on the RACK_ENV environment variable (see above for changing from default development). Then the `:reload=>dev` uses the dev variable to tell Unreload to reload files or not. Lastly the `run` command uses the dev variable to choose between running Unreloader, or bypass Unreloader and run App like normal in production.
## Additional credit
I took a lot of inspirations from Jeremy Evans [roda-sequel-stack](https://github.com/jeremyevans/roda-sequel-stack). Jeremy Evans is the author of Roda and also Unreloader, Sequel, and a ruby core contributor, among other things.

24
app.rb Normal file
View file

@ -0,0 +1,24 @@
# frozen_string_literal: true
require 'roda'
require 'tilt'
require 'tilt/erubi'
class App < Roda
plugin :render, escape: true
plugin :route_csrf
route do |r|
check_csrf!
r.root do
view :index
end
r.is String do |name|
@page_title = 'A Custom Greeting'
@name = name.capitalize
view :greeting
end
end
end

View file

@ -1,15 +1,9 @@
require 'roda'
class App < Roda
route do |r|
r.root do
"<h1>Hello, World!</h1>"
end
dev = ENV['RACK_ENV'] == 'development'
r.is String do |name|
"<h1>Hello, #{name.capitalize}!</h1>"
end
end
end
require 'rack/unreloader'
run App
Unreloader = Rack::Unreloader.new(:subclasses=>%w'Roda', :reload=>dev){App}
Unreloader.require './app.rb'
run(dev ? Unreloader : App)

3
views/greeting.erb Normal file
View file

@ -0,0 +1,3 @@
<p class="subtitle is-3">
Hello, <%= @name %>!
</p>

3
views/index.erb Normal file
View file

@ -0,0 +1,3 @@
<p class="subtitle is-3">
Welcome to my new page!
</p>

18
views/layout.erb Normal file
View file

@ -0,0 +1,18 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<title><%= @page_title || "My Website" %></title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
</head>
<body>
<section class="section">
<div class="container">
<h1 class="title is-1"><%= @page_title || 'Page Title Placeholder' %></h1>
<% # maybe put a flash section here some day %>
<%== yield %>
</div>
</section>
</body>
</html>