Use Rails to generate Golang code or manage Go app development
go-on-rails is a Rails generator aims to:
- Help to develop and integrate some APIs written in Golang to existing Rails app for high performance
- Use your familiar Rails tools to develop and manage a Golang app project
- Convert a not very complicated Rails app to Golang equivalent
Here's some examples:
- A simple example(tutorial) on the basic usage of go-on-rails generator
- An advanced example shows how to integrate Go APIs in a Rails project
- Another example shows how to handle a Rails session to get a user's info in a go-on-rails generated Go API
- Rails 4.2+ (Rails 6 not supported and need your help)
- Golang 1.10.x(mainly be compatible with github.com/go-sql-driver/mysql)
Add this line to your application's Gemfile:
gem 'go-on-rails', '~> 0.4.0'And then execute:
$ bundleOr install it yourself as:
$ gem install go-on-railsYou must have an existing Rails app or to create a new one before you try go-on-rails to generate Golang codes.
After that you can run the command just as other Rails generators:
rails g gor [dev(elopment) | pro(duction) | test | ...] [-m model_a model_b model_c ...] # OR (on rails version < 5.0) rake g gor ...here we take generating all models for the development environment for example:
rails g gor devThen a folder named go_app that includes Golang codes will be generated under your Rails app root path.
Install the dependent Golang packages for this Go project:
rails gor:depsThen change to the go_app directory and run:
go run main.goYou can visit the page in http://localhost:4000 by default.
More command details about go-on-rails generator:
rails g gor --help- Go project directory layout (all under the
go_appdirectory, likeviews,controllers,public) - A Go data struct corresponding to each activerecord model
- And each struct related CRUD functions/methods like FindModel, UpdateModel, DestroyModel etc. All these models related program files under the
go_app/modelsdirectory - And godoc files for all the functions under
go_app/models/doc - We use Gin as the default web framework, but you can change it to anyone that you favor in
main.goandcontrollersprograms
You can view the godoc page of all functions in http://localhost:7979/doc/models.html after run:
rails gor:docBesides, there's a sample project generated by go-on-rails, you can view its godoc at godoc.org just now to get a picture of what functions are generated.
The gem is still under development, so there're some known issues. You're welcomed to contribute. 👏
- databases specific functions between MySQL and Postgres or other databases are not covered completely
- sql.NullType not supported yet, so you'd better in the migrations set those columns "not null" with a default value that's consistent with Golang's zero value specification, such as "" default for string and text typed column, and 0 default for int, etc. And now we have an alternative approach for manipulating the database nullable fields, see the wiki Working with database nullable fields
- Associations
- has_many
- has_one
- belongs_to
- dependent
- Validations
- length
- presence
- format(string only)
- numericality(partially)
- other validations
- Pagination(details see wiki)
- Callbacks
- Transactions
- SQLite
- MySQL
- Postgres
- Built-in Pagination
- Working with database nullable fields
- Some Make commands
- Dockerize a Go-on-Rails application
- github.com/jmoiron/sqlx: an extension on the standard
database/sqldatabase API library - github.com/railstack/go-sqlite3: a SQLite driver(This's a forked version of mattn/go-sqlite3, and This is why we use this forked version)
- github.com/go-sql-driver/mysql: a MySQL driver
- github.com/lib/pq: a PostgreSQL driver
- github.com/asaskevich/govalidator: for the struct validation
- github.com/gin-gonic/gin: a HTTP web framework
When I had the idea to convert Rails app or build Golang app with Rails tools, I searched github and found the project: https://github.com/t-k/ar2gostruct. And from ar2gostruct I copied some codes on handling data structure conversion and models association, it made my idea come true faster than I imagined.
There're two branches at present: master and dev.
The dev branch has a whole Rails environment for development: models, seeds for testing, and under go_app directory there's a file named models_test.go used to test generated Golang codes.
- Fork the project switch to branch
dev. - Make your feature addition or bug fix.
- Add tests for it. This is important so I don't break it in a future version unintentionally.
- Commit, do not mess with Rakefile or version (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
- Send me a pull request. Bonus points for topic branches.
We create four models for testing:
- Physician
- Patient
- Appointment
- Picture
Run rails db:seed to use the data defined in db/seeds.rb. And change to go_app/models directory to run go test to test generated models-related functions. The test covers a small part of the functions currently. More will be added later on.
See the LICENSE file.
