诗歌rails之 Generator

关键字: rails generator 来看看怎样写自己的Generator吧
首先运行:
ruby代码
  1. ruby script/generate  
console中的输出可以看到Rails默认的generate:
ruby代码
  1. Installed Generators  
  2.   Builtin: controller, integration_test, mailer, migration, model, observer, plugin, resource, scaffold,  
  3. scaffold_resource, session_migration, web_service  
我们创建本机的generators目录:
ruby代码
  1. mkdir -p ~/.rails/generators/app_layout  
或者在某个rails项目里创建私有的generators:
ruby代码
  1. mkdir -p /Users/demo/rails/simple/generators/app_layout  
Generators有带参数和不带参数两种,先来看不带参数的Generator:
ruby代码
  1. app_layout  
  2. --app_layout_generator.rb  
  3. --USAGE  
  4.   templates  
  5. ----stylesheet.css  
  6. ----layout.rhtml  
我们看看不带参数的Generator的写法:
ruby代码
  1. class AppLayoutGenerator < Rails::Generator::Base  
  2.   def manifest  
  3.     record do |m|  
  4.       m.file "layout.rhtml""app/views/layouts/application.rhtml"  
  5.       m.file "stylesheet.css""public/stylesheets/application.css"  
  6.     end  
  7.   end  
  8. end  
我们的AppLayoutGenerator继承与Rails::Generator::Base,它的功能相当于cp layout.rhtml和stylesheet.css到后面的文件

我们再运行ruby script/generate看看:
ruby代码
  1. Installed Generators  
  2.   User: app_layout  
  3.   Builtin: controller, integration_test, mailer, migration, model, observer, plugin, resource, scaffold,  
  4. scaffold_resource, session_migration, web_service  
OK,我们看到除了Builtin的Generators,我们刚才创建的本机的app_layout这个Generator也出现在User Generators里

我们这样来使用它:
ruby代码
  1. ruby script/generate app_layout  
我们看到console打印出如下信息:
ruby代码
  1. create app/views/layouts/application.rhtml  
  2. create public/stylesheets/application.css  
系统自动创建了上面两个文件,内容为我们的app_layout/templates目录下的两个文件

如果我们想使用ruby script/generate app_layout home这样的方式,用home参数来指定创建home.rhtml和home.css,
我们该怎样写我们的Generator呢?
答案是继承Rails::Generator::NamedBase
ruby代码
  1. class AppLayoutGenerator < Rails::Generator::NamedBase  
  2.   def manifest  
  3.     record do |m|  
  4.       m.template "layout.rhtml""app/views/layouts/#{file_name}.rhtml"  
  5.       m.file "stylesheet.css""public/stylesheets/#{file_name}.css"  
  6.     end  
  7.   end  
  8. end  
除了使用m.template,我们还要修改layout.rhtml:
ruby代码
  1. <html>  
  2.   <head>  
  3.     <title>Untitled</title>  
  4.     <%%= stylesheet_link_tag '<%= file_name %>' %>  
  5.     <%%= javascript_include_tag :defaults %>  
  6.   </head>  
  7.   <body>  
  8.     <div id="container">  
  9.       <%% flash.each do |name, msg| %>  
  10.         <%%= content_tag :div, msg, :id => "flash_#{name}" %>  
  11.       <%% end %>  
  12.       <%%= yield %>  
  13.     </div>  
  14.   </body>  
  15. </html>  
这里的template使用<%% %>而不是<% %>
我们可以看看Rails源码/railties/lib/rails_generator/generators/components/scaffold/templates/layout.html.erb:
ruby代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  2.        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  3.   
  4. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">  
  5. <head>  
  6.   <meta http-equiv="content-type" content="text/html;charset=UTF-8" />  
  7.   <title><%= controller_class_name %>: <%%= controller.action_name %></title>  
  8.   <%%= stylesheet_link_tag 'scaffold' %>  
  9. </head>  
  10. <body>  
  11.   
  12. <p style="color: green"><%%= flash[:notice] %></p>  
  13.   
  14. <%%= yield  %>  
  15.   
  16. </body>  
  17. </html>  
posted @ 2009-07-10 10:15  麦飞  阅读(515)  评论(0编辑  收藏  举报