railscaffold script – for namespace supporting

March 12th, 2009 no comment

使用 rails 2.2.2 自带的 scaffold 生成带命名空间的脚本架时(如 Admin::Product),scaffold 会生成带命名空间的model(app/models/admin/product.rb),并且生成的 controller 代码看起来也很怪异,不能工作,想到后面还有那么多 scaffold 要生成,一个一个手动改实不在符合 DRY 精神,So, 写个脚本做些自动清理调整的工作看来相当有必要。

when running scaffold came with rails 2.2.2 with namespace(i.e. Admin::Product), it generates new model with namespace(app/models/admin/product.rb) and controller code looks wierd, which normally you didn’t expect it, this script done some fixing for u

环境 Env
ruby 1.8.7 / gems 1.3 / rails 2.2.2

注意 Notice
脚本只能在 rails app 的根目录下运行
this script can only run in rails app root directory.

#!/usr/bin/env ruby
require 'rubygems'
require 'active_support/inflector'

include ActiveSupport

scaffold = ARGV[0]
puts `script/generate scaffold #{scaffold}`
if scaffold =~ /::|\//
  puts `script/destroy model #{scaffold}`
  path = Inflector.underscore(Inflector.pluralize(scaffold))
  full_class_name = Inflector.camelize(Inflector.singularize(path))
  class_name = Inflector.demodulize(full_class_name)
  model = Inflector.underscore(class_name)
  models = Inflector.pluralize(model)
  controller_path = "app/controllers/#{path}_controller.rb"
  code = File.open(controller_path, 'r') {|f| f.read}
  wrong_path = path.gsub('/', '_')
  code.gsub!(/\/#{wrong_path}/, '/'+path)
  code.gsub!(/@#{wrong_path}/, '@'+models)
  code.gsub!(/#{full_class_name}(\W)/, class_name+'\1')
  code.gsub!(/redirect_to\(@#{model}\)/, "redirect_to(['#{File.dirname(path)}', @#{model}])")
  File.open(controller_path, 'w') {|f| f.write code}
end

Leave A Comment

All fields marked with "*" are required.





Allowed tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>