Trong Rails 3, những gì bạn đang muốn làm là có thể tưởng tượng được, nhưng theo một cách hacky. Đây là cách:
Khi bạn thực hiện cuộc gọi rails generate
, các callpath trông như thế này:
Trong rails/commands mã mà chạy cho generate:
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
Các điểm đáng chú ý được đánh số trên. Cụ thể, tại điểm #1
lệnh bạn đang chạy đang dịch chuyển khỏi số ARGV
. Trong trường hợp của bạn có nghĩa là generate
sẽ bị xóa khỏi dòng lệnh args.
Tại điểm #2
môi trường của bạn được tải, tại thời điểm khởi tạo của bạn sẽ được thực hiện. Và đây là một phần khó khăn - bởi vì không có gì chỉ ra một lệnh cụ thể đã được tải vào thời điểm này (điều này xảy ra tại #3
) không có thông tin để xác định một máy phát điện đang được chạy!
Hãy chèn một đoạn script vào config/initializer/debug.rb
để xem những gì có sẵn nếu chúng tôi chạy rails generate model meep
:
puts $0 #=> "script/rails"
puts ARGV #=> ["model", "meep"]
Như bạn có thể thấy, không có thông tin trực tiếp mà một máy phát điện đang được chạy. Điều đó nói rằng, có thông tin gián tiếp. Cụ thể là ARGV[0] #=> "model"
. Conceivably bạn có thể tạo ra một danh sách các máy phát điện có thể và kiểm tra xem máy phát điện đó đã được gọi trên ARGV[0]
. Các nhà phát triển có trách nhiệm trong tôi nói rằng đây là một hack và có thể phá vỡ theo cách bạn không mong đợi vì vậy tôi sẽ sử dụng điều này một cách thận trọng.
Tùy chọn duy nhất khác là sửa đổi script/rails
như bạn đã đề xuất - đây không phải là giải pháp quá tệ, nhưng có khả năng sẽ xảy ra khi bạn nâng cấp lên Rails 4.
Trong Rails 4, bạn đã có hy vọng nhiều hơn nữa! Vào thời điểm application environment is being loaded, không gian tên máy phát điện đã được tải. Điều này có nghĩa là trong trình khởi tạo, bạn có thể thực hiện các thao tác sau:
if defined? Rails::Generators #=> "constant"
# code to run if generators loaded
else
# code to run if generators not loaded
end