🎍 Gray's Space (Root)

<-- Back

Turn on syntax highlighting

Controllers

are actually views and controllers in one. I decided for such a simple protocol, it's better to just inline styles rather than adding a whole other template system. We already have string interpolation in Ruby! (You are of course free to use File.read to load any files you wish to send to clients)

Controllers should be direct children in the file tree under /app and have a file name that ends with _controller. You cannot nest controllers. Controllers manage their route with any number of actions. Actions are methods in side your controller.

A simple example would be a simple static document, here we extend Controller, and define our own methods, HelloController#get, HelloController#greet_get and HelloController#greet_answer. We'll assume we assigned this controller to the route "hello" in /config/routes.rb.

╭────────────────────────┤ app/hello_controller.rb ├─╮

   class HelloController < Controller
     # /hello
     def get
       respond_with <<~TEXT
         # 🎍 Gray's space
         Giving Gemini a try! It feels cozy. <3
   
         => /hello/greet Get a personalized hello
       TEXT
     end
   
     # /hello/greet
     def greet_get
       ask_for "What's your name?"
     end
   
     # /hello/greet?name_will_be_here
     def greet_answer(name)
       respond_with <<~TEXT
         Hello #{name}!
       TEXT
     end
   end

╰────────────────────────────────────────────────────╯

You can include as many actions as you want! Private methods will not be accessible from the Gemini service, so you can keep things DRY by keeping common logic in private methods.

Note: A controller is always instantiated fresh for every connection. You cannot keep data between requests in this class. Use a persistent for that.

See Persistents

You assign controllers to routes using the /config/routes.rb file.

API

Controller#respond_with

respond_with "Hello"

Respond to client with a text/gemini response. The gemini status code will be 20. You may want to use multiline comments like <<~TEXT to make things a little cleaner.

This MUST be the return statement in your action for it to work.

Controller#ask_for

ask_for "What is your age?"

Sends back a request to the user to provide a string. You can include a question to be shown on the client. The gemini status will be 10.

This MUST be the return statement in your action for it to work.

Controller#redirect_to

redirect_to "gemini://gem.graypegg.com"

Sends back a redirect to the client. This will normally ask the user if they want to be redirect.

This MUST be the return statement in your action for it to work.

Controller#use_persistent

use_persistent(:GuestbookPersistent).all_messages

Gets the current instance of a persistent.

See Persistents

Controller#get / Controller#*_get

def get; end
def ailurus_get; end

Controller action for requests with no user input data. (No ? in the URI)

Controller#answer / Controller#*_answer

def answer(input); end
def fulgens_answer(input); end

Controller action for requests with user input data. (that have a ? in the URI)