在的Rails 3,你希望做什麼是可以想到的,但在哈克的方式。具體方法如下:
當您進行rails generate
呼叫時,CALLPATH看起來是這樣的:
在rails/commands,對生成的代碼運行:
ARGV << '--help' if ARGV.empty?
aliases = {
"g" => "generate",
"c" => "console",
"s" => "server",
"db" => "dbconsole"
}
command = ARGV.shift # <= #1
command = aliases[command] || command
case command
when 'generate', 'destroy', 'plugin', 'benchmarker', 'profiler'
require APP_PATH
Rails.application.require_environment! # <= #2
require "rails/commands/#{command}" # <= #3
的興趣點在上面編號。也就是說,在點#1
您正在運行的命令正在從ARGV
移出。在你的情況下,這意味着generate
將從命令行參數中刪除。
在點#2
你的環境被加載,在這一點你的初始化將被執行。這裏有一個棘手的部分 - 因爲這時沒有任何指示特定命令的裝載(這發生在#3
),沒有信息可以確定發電機正在運行!
讓我們插入腳本到config/initializer/debug.rb
,看看什麼是可用的,如果我們跑rails generate model meep
:
puts $0 #=> "script/rails"
puts ARGV #=> ["model", "meep"]
正如你所看到的,沒有直接的信息發電機正在運行。這就是說,有間接的信息。即ARGV[0] #=> "model"
。可以想象,您可以創建一個可能的生成器列表,並檢查是否已在ARGV[0]
上調用該生成器。我這個負責任的開發人員說這是一種黑客攻擊,並且可能會以你不期待的方式破解,所以我會謹慎使用它。
唯一的其他選擇是修改script/rails
像你所建議的 - 這不是一個太糟糕的解決方案,但是當你升級到Rails 4時可能會中斷。
在軌道4,你有更多的希望!到application environment is being loaded時,發生器命名空間已經被加載。這意味着在初始化程序中,您可以執行以下操作:
if defined? Rails::Generators #=> "constant"
# code to run if generators loaded
else
# code to run if generators not loaded
end