【发布时间】:2011-01-07 22:37:16
【问题描述】:
我已经为 rails 3 中的控制器创建了一个生成器。 现在我想在使用脚手架生成器时将此生成器用作默认生成器。
这可能吗?
【问题讨论】:
标签: ruby-on-rails
我已经为 rails 3 中的控制器创建了一个生成器。 现在我想在使用脚手架生成器时将此生成器用作默认生成器。
这可能吗?
【问题讨论】:
标签: ruby-on-rails
自定义控制器文件的正确位置是lib/templates/rails/scaffold_controller/controller.rb
【讨论】:
rails g scaffold user name:string 忽略该文件。
rails g scaffold_controller Group 有效,但 rails g scaffold Group 仍然获取默认控制器模板
rails g scaffold Group 实际上是在我的包中获取 strong_parameters gem 控制器模板。
如果你只是想使用自己的控制器模板,你可以把它放在lib/templates/rails/scaffold_controller/controller.rb
如果你想替换 scaffold_controller_generator 代码本身,例如,让控制器脚手架生成额外的类文件。您可以使用lib/generators/rails/my_scaffold_controller/templates 下的模板创建lib/generators/rails/my_scaffold_controller/my_scaffold_controller_generator.rb。
记得在config/application.rb 中将rails 指向新的scaffold_controller:
config.generators do |g|
g.scaffold_controller = "my_scaffold_controller"
end
对于my_scaffold_controller_generator.rb,如果您想修改默认行为,可以从railties-3.x.x/lib/rails/generators/rails/scaffold_controller 下的railties gem 复制,或者如果您只想添加功能,可以从它继承:
require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
module Rails
module Generators
class MyScaffoldControllerGenerator < ScaffoldControllerGenerator
source_root File.expand_path("../templates", __FILE__)
def new_funtionality
end
end
end
end
【讨论】:
您可以覆盖 Rails 用于其生成器的模板。在这种情况下,只需将文件放在lib/templates/scaffold_controller/controller.rb 并根据需要进行修改。下次你运行 rails g scaffold [modelName] 时,它会选择这个新的控制器模板并使用它。
这在Section 6 of the Creating and Customizing Rails Generators官方指南中有介绍。
【讨论】:
gems/railties-3.x.x/lib/rails/generators。您可以在命令行上使用$> gem environment 找到您的 GEM PATH。
这似乎在 Rails 4 中略有改变。您可以在生成脚手架时看到生成器将在调用行中查找哪个模板,并且您的模板文件夹名称应与此匹配:
rails generate scaffold blub
...
invoke responders_controller
如果你使用 rails g scaffold_controller blubs,模板的位置应该是:
lib/templates/rails/scaffold_controller/controller.rb
如果你使用 rails g scaffold blub,模板的位置应该是:
lib/templates/rails/responders_controller/controller.rb
【讨论】:
如果有人想知道为什么这在默认的 Rails 4 安装中不起作用,那是因为 jbuilder 将自己插入到覆盖位置之前的模板路径中。我不需要 jbuilder 所以我删除了它,但我也在 Github 中报告了一个问题。希望它会尽快修复。
【讨论】: