This is an simple example for the go-on-rails, a Rails generator.
You can take the example as a tutorial, too. I'll make it as simple and clear as possible to show how to use the go-on-rails generator to generate Golang codes in a Rails app.
Even though I highly recommend you to get a quick overview of go-on-rails to learn some commands usage before taking further in this example.
- macOS Sierra v10.12.4
- Ruby v2.6.3
- Rails v5.0.2
- MySQL v5.7.11
- Golang v1.12.6 darwin/amd64
Firstly, we will follow the tutorial in Rails guides, to build a (very) simple weblog. We may not copy that whole steps, but the models mainly.
Let's create a new Rails app:
rails new example_simple --api --database mysql --skip-bundlechange to the new directory, add the gem go-on-rails:
# edit Gemfile
gem 'go-on-rails', '~> 0.4.0'and then bundle:
bundle installWe'll build two models: Article and Comment. And there's a has_many association between them.
rails g model Article title:string text:textrails g model Comment commenter:string body:text article_id:integerYou'd better add some restrictions to the migration files to give a limit on database level, eg. add null: false to the title column:
# the migration file under db/migrate
class CreateArticles < ActiveRecord::Migration[5.0]
def change
create_table :articles do |t|
t.string :title, null: false
t.text :text
t.timestamps
end
end
endAnd meanwhile we add some presence and length validations to the models:
# app/models/article.rb
class Article < ApplicationRecord
has_many :comments, dependent: :destroy
validates :title, presence: true, length: { in: 10..30 }
validates :text, presence: true, length: { minimum: 20 }
end
# app/models/comment.rb
class Comment < ApplicationRecord
belongs_to :article
validates :commenter, presence: true
validates :body, presence: true, length: { minimum: 20 }
endThen run the migration:
rails db:migrateNow it's time to show magic!
Run the command:
rails g gor devand a new directory named go_app with some files will be created under the root of Rails app:
# directory structure of go_app
├── controllers
│ └── home_controller.go
├── main.go
├── models
│ ├── db.go
│ ├── gor_article.go
│ └── gor_comment.go
├── public
│ └── favicon.ico
└── views
└── index.tmpl
then let's install Golang dependancies(some packages) we'll use:
rails gor:depswhen the installation completed after some while, make sure you now under the root of go_app and run:
go run main.goopen http://localhost:4000 by default in your browser, you can see a welcome page from go-on-rails:
The dir serves the static assets. You can create new directories or files under public, or you can create any other directories under the go_app, and then set the routes for serve the file system. How to set it
- Each file here heading with
gor_corresponding to each model we created by therails g modelcommand above, all functions are mostly for database CRUD manipulations, and also some basic validations and associated operations - You can create new
.gofiles to add more functions for the models under themodelsdirectory using the package namemodel - You can view the godoc page of all functions in http://localhost:7979/doc/models.html after run:
rails gor:doc- Now only a
controllersdirectory and ahome_controllerare generated by default - Under the
controllersdirectory we can create handlers for the HTTP routes we set in themain.gofile, we call themcontrollersby the Rails convention - For the structure clearity we create one controller file corresponding to each model like Rails does, too
- yes, you can put all the template files here
- Because we choose the Gin HTTP framework, we can load all the templates in at initial time See how to config it
In this simple example we just build APIs interacting with data in JSON format.
- We create
articles_controller.goandcomments_controller.gofor each model. Each function to a RESTful action. - Import
modelpackage to use avaliable functions and methods we have generated
In the main.go add some routes to map the HTTP requests to the right handlers we created in the controller files.
// for the articles
r.GET("/", c.HomeHandler)
r.GET("/articles", c.ArticlesIndex)
r.POST("/articles", c.ArticlesCreate)
r.GET("/articles/:id", c.ArticlesShow)
r.DELETE("/articles/:id", c.ArticlesDestroy)
r.PUT("/articles/:id", c.ArticlesUpdate)In a terminal window run go run main.go, in another terminal use curl command to test API we added.
For example, to get all article records:
curl -XGET 'http://localhost:4000/articles'To create a new article, run:
curl -XPOST 'http://localhost:4000/articles' -d '{ "title": "Use go-on-rails to build a Golang app", "text": "blablabla..." }'You can check the main.go and controller files in this repository for details.
