Model, View, Controller のフレームワークに、サービス層を付け加えたほうがいいのでは〜?という記事をこの前書きました。
RAILSでのアプリケーション作成 - MVC
そこで、
- app/services 以下に指定した名前のサービスクラスを作成
- test/unit 以下に作成したサービスに対するTest用クラスを作成
以上の機能を持ったrakeコマンドを作成しました。
以下のスクリプトを, lib/tasks の中に作成してください (ファイル名は service.rake)
# encoding: utf-8 # サービスクラスを作成する # app/services以下 # # rake service:create SERVICE="hoge" # このコマンドで、app/services/hoge_service.rbが作成 class名はHogeService namespace :service do # service ファイルの作成 task :create do service_file_name = ENV['SERVICE'].to_s if service_file_name != "" and File.extname(service_file_name).empty? then service_file_name = service_file_name + "_service" services_dir = File::expand_path('./app/services'); # services ディレクトリがなかったら作成 FileUtils.mkdir_p(services_dir) unless FileTest.exist?(services_dir) service_file_path = services_dir + "/" + service_file_name + ".rb" classname = convert_to_camelcase(service_file_name) if make_service_class(classname, service_file_path) then print "\e[34m" + "app/services/" + service_file_name + ".rb\e[0m" + "を作成しました。\n" # UnitTest用のクラス作成 test_services_dir = File::expand_path('./test/unit'); test_service_file_path = test_services_dir + "/" + service_file_name + "_test.rb" if make_service_test_class(classname, test_service_file_path) then print "\e[34m" + "test/unit/" + service_file_name + "_test.rb" + "\e[0m" + "を作成しました。\n" end else print "\e[41m" + "既に指定したサービスが存在しています。" + "\e[0m\n" end else print "\e[41m" + "正しい SERVICE パラメータを指定して下さい。" + "\e[0m\n" end end def convert_to_camelcase(str) return str.split('_').map{|s| s.capitalize}.join('') end def make_service_class(service_class_name, filepath) if !FileTest.exist?(filepath) then test_program = <<EOS # encoding: utf-8 class %%CLASS_NAME%% end EOS test_program = test_program.sub("%%CLASS_NAME%%", service_class_name) f = open(filepath, "w") f.write(test_program) f.close() return true else return false end end def make_service_test_class(service_class_name, filepath) if !FileTest.exist?(filepath) then test_program = <<EOS # encoding: utf-8 class %%CLASS_NAME%%Test < ActiveSupport::TestCase end EOS test_program = test_program.sub("%%CLASS_NAME%%", service_class_name) f = open(filepath, "w") f.write(test_program) f.close() return true else return false end end endこのファイルを作成し、
$ rake service:create SERVICE="hoge_hoge"
とすれば、
- app/services/hoge_hoge_service.rb が作成されます。
- 同時に、test/unit/hoge_hoge_service_test.rb が作成されます。
ちょー適当に作りましたが、メモ残しておきます。 ノリで、rakeの独自タスクの作成テストとして作っただけなので、めちゃくちゃ汚いソースコードですが勘弁して下さい。。。すいません。。。