Rails 【分享】generator 的那些事

easyhappy · 2014年07月19日 · 最后由 meeasyhappy 回复于 2014年07月19日 · 3255 次阅读

Rails 自带的 generators

在一个 Rails 项目中,有很多自带的 genertors,比如最常用的 scaffold,通过命令 rails generator 可以列出所有的 generators:

Rails:
  assets
  controller
  generator
  helper
  integration_test
  mailer
  migration
  model
  resource
  scaffold
  scaffold_controller
  task

ActiveRecord:
  active_record:devise
  active_record:migration
  active_record:model

如果你想查看一个具体 generator 的使用说明,比如 scaffold,使用

rails g scaffold --help

generators 的源码在哪里?

大部分 Rails 自带的 generators 都放到 gem raities-4.0.0/rails/generators中。 我们就拿scaffold 举例子,主要有三部分组成 :

templates/ 所有的模板
USAGE 可以理解成readme
scaffold_generator.rb #generator入口

下面主要看看 scaffold_generator.rb, 这里就不贴代码,如果感兴趣可以 进入源码位置 看看,这里这是说明几个关键点:

1)source_root 定义了 templates 的位置 2)其中有一句 hook_for :scaffold_controller, required: true;hook_for 的作用唤起一个 generator。 3) 所有的 public 方法都会被调用。

generators 的加载方式

rails/generators/initializer/initializer_generator.rb generators/initializer/initializer_generator.rb rails/generators/initializer_generator.rb generators/initializer_generator.rb $LOAD_PATH

编写自定义 generator,提高工作效率

在我们日常的工作中,总会有一些 工作是一些重复,且相同的工作,特别像后台管理页面的一些页面。针对这些情况,编写相应的 generator,可以大大提高我们的工作效率。

[题外话] 个人向大家showbuilder(这个@ery编写的), 个人觉得是后台管理页面的必备 gem,这里 就不对它细说了。

今天要的说是 基于它写了一套generators

rails generator showbuilder:slim
rails generator showbuilder:scaffold

比如运行 rails g showbuilder:scaffold admin/my_generators

    invoke  resource_route
     route    namespace :admin do
  resources :my_generators
end
    invoke  slim
    create    app/views/admin/my_generators
    create    app/views/admin/my_generators/index.html.slim
    create    app/views/admin/my_generators/edit.html.slim
    create    app/views/admin/my_generators/show.html.slim
    create    app/views/admin/my_generators/new.html.slim
    create    app/views/admin/my_generators/_form.html.slim
    create  app/controllers/admin/my_generators_controller.rb
 identical  lib/reborn/base_mongo.rb
    create  app/models/admin/my_generator.rb

当然如果你想使用自己的模板,那么在 Rails.root/config/showbuilder/templates 下建立对于的模板文件就可以了。

写在最后

如果你对这个 gem 感兴趣,可以阅读源码 了解相关机制。

1 楼 已删除

@leekelby 如果想 自定义一些流程,比如我针对 gem showbuidler 写一套 generator,这个时候就可以将对应的 templates 写在 showbuilder/templates 中,类似 slim-rails 中的 generator.

3 楼 已删除

@leekelby 将这个 generator 封装到一个 gem 的目的,可以在多个项目里面使用,而不用写重复的代码了。 仅此而已,当然 按照http://guides.rubyonrails.org/generators.html 上介绍 放到 lib 下面,也没有问题, 就是不太方面复用而已。

5 楼 已删除
需要 登录 后方可回复, 如果你还没有账号请 注册新账号