<commit_before>[![Gem Version](https://badge.fury.io/rb/go-on-rails.svg)](https://badge.fury.io/rb/go-on-rails)

<img align="right" width="260" height="260" src="./go-on-rails.png">

go-on-rails
====

`go-on-rails` 的目标功能主要有：

1. 对于 Rails 应用中的某些需要高性能的接口，使用 go-on-rails 来生成代码，并把生成的 Go 接口集成进 Rails 项目进行替换
2. Rails 程序员可以使用熟悉的工具链开发和管理一个 Golang 的项目

下面是两个示例教程：
* [简单示例](https://github.com/goonr/example_simple) 仿照 Rails guides 里那个入门的 [demo](http://guides.rubyonrails.org/getting_started.html)，演示如何使用 go-on-rails 创建和生成一个简单 blog 的 Go API。
* [高级教程](https://github.com/goonr/example_with_admin)  如何创建一个 Go 项目，并和 rails_admin, devise, cancancan 等集成，为 Go 项目快速增加一个管理后台。同时该项目演示了如何使用 Rails 5.1 新发布的 webpacker 工具，并利用 React 制作独立的前端界面在 Rails 中调用 Go 接口。

## 安装环境要求

* Rails 4.2 及以上
* Golang 1.4 及以上

## 安装

在 Rails 项目的 Gemfile 中添加下面一行:

```ruby
gem 'go-on-rails', '~> 0.1.8'
```

然后运行:
```bash
$ bundle
```

## 用法

在运行生成 Go 代码的命令之前，你得保证已经在 Rails 中至少已经创建了一个 Model，然后运行如下格式的命令来生成 Go 代码：

```bash
rails g gor [dev(elopment) | pro(duction) | test] [-m model_a model_b model_c ...]
```

运行后会在 Rails 项目的根目录生成一个 `go_app` 的文件夹。

接下来运行命令安装这个 Go 项目默认依赖的包：

```bash
rails gor:deps
```

然后进入到 `go_app` 目录下，启动 Go 服务器：

```bash
cd go_app
go run main.go
```

这时可以在浏览器中访问 http://localhost:3000，正常的话会看到类似一个新建 Rails 项目的默认首页。

关于这个生成器命令行的更多用法可以查看 go-on-rails 其帮助选项：

```bash
rails g gor --help
```

## 该命令都会生成些什么？

* Go 项目的布局（所有程序都在 `go_app` 文件夹下，如 `views`、 `controllers`、 `public` 等）
* 针对每个 activerecord Model 生成相应的 Go 数据结构
* 同时针对每个数据结构生成相关的 CRUD 函数／方法，如 FindModel, UpdateModel, DestroyModle 等等。所有这些 Model 相关的代码都生成在 `go_app/models` 目录下。
* 在文件夹 `go_app/models/doc` 下生成的所有函数的 godoc 文档
* 我们默认使用 [Gin](https://github.com/gin-gonic/gin) 作为我们的 Web 框架，你也可以通过改动 `main.go` 以及 `controllers` 等文件来使用你喜欢的框架，同时配合使用生成的 Model 相关的函数

### 查看生成函数(方法)的 godoc

可以通过运行如下命令在浏览器中查看所有生成的函数文档：

```bash
rails gor:doc
```

浏览器地址为：http://localhost:7979/doc/models.html 。

## 已知问题

* 没有针对不同的数据库，比如 MySQL, Postgres 分别生成其不同的版本
* 没有支持 sql.NullType 的数据类型，所以如果某个表中的字段出现 Null 时程序可能会出错，所以目前临时的做法是：你最好在 migration 中定义好 "not null"，给一个和 Go 的数据类型的零值相一致的默认值。

- [x] Associations
  - [x] has_many
  - [x] has_one
  - [x] belongs_to
  - [x] dependent
- [x] Validations
  - [x] length
  - [x] presence
  - [x] format(string only)
  - [x] numericality(partially)
  - [ ] other validations<commit_msg>update README_zh<commit_after>[![Gem Version](https://badge.fury.io/rb/go-on-rails.svg)](https://badge.fury.io/rb/go-on-rails)

<img align="right" width="260" height="260" src="./go-on-rails.png">

go-on-rails
====

`go-on-rails` 的目标功能主要有：

1. 对于 Rails 应用中的某些需要高性能的接口，使用 go-on-rails 来生成代码，并把生成的 Go 接口集成进 Rails 项目进行替换
2. Rails 程序员可以使用熟悉的工具链开发和管理一个 Golang 的项目

下面是两个示例教程：
* [简单示例](https://github.com/goonr/example_simple) 仿照 Rails guides 里那个入门的 [demo](http://guides.rubyonrails.org/getting_started.html)，演示如何使用 go-on-rails 创建和生成一个简单 blog 的 Go API。
* [高级教程](https://github.com/goonr/example_with_admin)  如何创建一个 Go 项目，并和 rails_admin, devise, cancancan 等集成，为 Go 项目快速增加一个管理后台。同时该项目演示了如何使用 Rails 5.1 新发布的 webpacker 工具，并利用 React 制作独立的前端界面在 Rails 中调用 Go 接口。

## 安装环境要求

* Rails 4.2 及以上
* Golang 1.4 及以上

## 安装

在 Rails 项目的 Gemfile 中添加下面一行:

```ruby
gem 'go-on-rails', '~> 0.1.8'
```

然后运行:
```bash
$ bundle
```

## 用法

在运行生成 Go 代码的命令之前，你得保证在 Rails 中至少已经创建了一个 Model，然后运行如下格式的命令来生成 Go 代码：

```bash
rails g gor [dev(elopment) | pro(duction) | test] [-m model_a model_b model_c ...]
```

运行后会在 Rails 项目的根目录生成一个 `go_app` 的文件夹。

接下来运行命令安装这个 Go 项目默认依赖的包：

```bash
rails gor:deps
```

然后进入到 `go_app` 目录下，启动 Go 服务器：

```bash
cd go_app
go run main.go
```

这时可以在浏览器中访问 http://localhost:3000，正常的话会看到一个类似新建的 Rails 项目的默认首页。

关于这个生成器命令行的更多用法可以查看 go-on-rails 的帮助选项：

```bash
rails g gor --help
```

## 该命令都会生成些什么？

* 一个 Go 项目的目录布局（所有程序都在 `go_app` 文件夹下，在其下面包括如 `views`、 `controllers`、 `public` 等文件夹）
* 针对每个 activerecord 的 Model 生成相应的 Go 数据结构
* 同时针对每个数据结构生成相关的 CRUD 函数／方法，如 FindModel, UpdateModel, DestroyModle 等等。所有这些 Model 相关的代码都生成在 `go_app/models` 目录下。
* 在文件夹 `go_app/models/doc` 下生成的所有函数的 godoc 文档
* 我们默认使用 [Gin](https://github.com/gin-gonic/gin) 作为我们的 Web 框架，你也可以通过改动 `main.go` 以及 `controllers` 等文件来使用你喜欢的框架，同时配合使用生成的 Model 相关的函数

### 查看生成函数(方法)的 godoc

可以通过运行如下命令在浏览器中查看所有生成的函数文档：

```bash
rails gor:doc
```

浏览器地址为：http://localhost:7979/doc/models.html 。

## 已知问题

* 没有针对不同的数据库，比如 MySQL, Postgres 分别生成其不同的版本
* 没有支持 sql.NullType 的数据类型，所以如果某个表中的字段出现 Null 时程序可能会出错，所以目前临时的做法是：你最好在 migration 中定义好 "not null"，给一个和 Go 的数据类型的零值相一致的默认值。

- [x] Associations
  - [x] has_many
  - [x] has_one
  - [x] belongs_to
  - [x] dependent
- [x] Validations
  - [x] length
  - [x] presence
  - [x] format(string only)
  - [x] numericality(partially)
  - [ ] other validations
{'fraction_non_alphanumeric': 0.14451612903225808, 'fraction_numerical': 0.010752688172043012, 'mean_word_length': 4.685819070904645, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 7, 'https://': 10, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3769960', 'n_tokens_mistral': 2907, 'n_tokens_neox': 2993, 'n_words': 446}