`
hideto
  • 浏览: 2678448 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

每天一剂Rails良药之Automating Development With Your Own Generators

    博客分类:
  • Ruby
阅读更多
今天看看怎么写自己的Generators
Rails在以下地方查找用户自定义的Generators:
RAILS_ROOT/lib/generators
RAILS_ROOT/vendor/generators
RAILS_ROOT/vendor/plugins/any_subdirectory/generators
~/.rails/generators
以及以_generator为后缀的Gems
我们看看一个例子代码:
class TumblepostGenerator < Rails::Generator::NamedBase
  def manifest
    record do |m|
      m.class_collisions class_name
      m.template  "app/controllers/controller_template.rb",
                  "app/controllers/#{file_name}_controller.rb"
      m.template  "app/models/model_template.rb",
                  "app/models/#{file_name}.rb"
      m.directory File.join('app/views', file_name)
      m.template  "app/views/form_template.rhtml",
                  "app/views/#{file_name}/_form.rhtml"
      m.template  "app/views/view_template.rhtml",
                  "app/views/#{file_name}/_view.rhtml"

      m.readme "POST_GENERATION_REMINDER"
    end
  end
end

其中Rails::Generator::NamedBase是ruby script/generator后面带参数的,而Rails::Generator::Base是不带参数的
生成的文件会先用ERB解析,这样我们可以自己构建生成文件的模板,如:
class <%= class_name %>Controller < TumblepostController
  def new
    @thing = <%= class_name %>.new
  end

如果我们要生成数据库Migration,我们可以这样写:
m.migration_template "db/migrations/migration_template.rb", "db/migrate"

事实上已经有很多Generators创建好并以gems部署了,让我搜索一下:
gem search -r generator
分享到:
评论
3 楼 hideto 2007-06-04  
引用

File.join(string, ...) → path

Returns a new string formed by joining the strings using File::SEPARATOR.

   File.join("usr", "mail", "gumby")   #=> "usr/mail/gumby"

2 楼 liusong1111 2007-06-04  
指定相对路径,则生成的文件相对于ruby script/generate命令执行时的当前目录,File.join不是必须的,第一个问题想明白了。
1 楼 liusong1111 2007-06-04  
受教了。
一个疑问:m.template第二个参数也应该用File.join吧?看了几处别的地方的代码都用了。
Rails::Generator::Base区别于Rails::Generator::NamedBase貌似是这样的:

引用
the controller generator expects a [controller name] as its first argument, followed by a list of [actions]. If your generator follows that pattern, choose NamedBase?; otherwise, choose Base.

Base也可以接收参数吧,通过args。
引用自:
http://wiki.rubyonrails.org/rails/pages/UnderstandingGenerators

相关推荐

Global site tag (gtag.js) - Google Analytics