rails脚手架学习入门(一)

概述

目前公司的新项目很多都是基于Rails开发,不同的服务都需要不同的Rails项目。而每一个Rails项目中往往会需要配置同样的Gem包,如mysql 、grape、rspec等。另一方面,可能有的Gem包并不是所有的项目都是通用的,比如redies, sidekiq、mina等。
因此,萌发了写死通用Gem包的配置 + 用脚手架配置可选Gem的想法。这篇博客,便是以Rails guides上的指南Creating and Customizing Rails Generators & Templates,学习脚手架的构造,并对其未深入的地方进行探究。如有理解错误,还请斧正。

第一个脚手架

查看现有脚手架列表

rails generate
#detail
rails generate example --help

创建脚手架

1.自建文件

#file in lib/generators/initializer_generator.rb
class InitializerGenerator < Rails::Generators::Base
  def create_initializer_file
    create_file "config/initializers/initializer.rb", "# Add initialization content here"
  end
end

之后运行

rails generate initializer 

会生成config/initializers/initializer.rb文件, 文件内容为

#Add initialization content here

有以下几个方面需要额外说明一下:
1) 函数名不影响功能,运行脚手架命令式,函数会被依次调用;
2) create_file这类函数来自于Thor, 后文会详细说明。
3) 除了继承自Rails::Generators::Base, 还可以继承自Rails::Generators::NamedBase.后文在Generators基类部分讲到。

2.用脚手架初始化创建脚手架

bin/rails generate generator initializer
      create  lib/generators/initializer
      create  lib/generators/initializer/initializer_generator.rb
      create  lib/generators/initializer/USAGE
      create  lib/generators/initializer/templates

其中,

#lib/generators/initializer/initializer_generator.rb
class InitializerGenerator < Rails::Generators::NamedBase
  source_root File.expand_path("../templates", __FILE__)
end

其中initializer_generator.rb和USAGE为文件,templates为文件夹
source_root方法指示, 脚手架的templates文件的目录位置。默认为”../templates/目录下”。
其中,templates文件中一般是存放文件,在generator文件函数中,通过Thor template的函数进行文件的创建。template的第一个参数是文件名,用erb对文件进行解析。
rspec使用脚手架的实例

rails generate rspec:helper test
  create  spec/helpers/test_helper_spec.rb

内容为

require 'rails_helper'

# Specs in this file have access to a helper object that includes
# the TestHelper. For example:
#
# describe TestHelper do
#   describe "string concat" do
#     it "concats two strings with spaces" do
#       expect(helper.concat_strings("this","that")).to eq("this that")
#     end
#   end
# end
RSpec.describe TestHelper, type: :helper do
  pending "add some examples to (or delete) #{__FILE__}"
end

当运行如下脚手架时:

rails generate initializer

rails会按照如下顺序寻找运行代码:

lib/rails/generators/initializer/initializer_generator.rb
lib/generators/initializer/initializer_generator.rb
lib/rails/generators/initializer_generator.rb
lib/generators/initializer_generator.rb

如果以上目录都没有找到,则报错。
所以,可以发现,若采用第一种方式建立的脚手架,优先级会低于第二种方式建立脚手架的。并且,推荐使用第二种方式的文件组织形式。

Generators基类::

  1. Rails::Generators::Base:
rails generate test [options]
  1. Rails::Generators::NamedBase: 期待传入一个NAME参数,当需要创建一个自定义名字的文件时,这种方式很有效。
rails generate test NAME [options]
#generator文件中
def create_test_generator
  copy_file "initializer.rb", "config/initializers/#{file_name}.rb"
end

参考资料
Creating and Customizing Rails Generators & Templates
Thor’s Documents

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值