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の独自タスクの作成テストとして作っただけなので、めちゃくちゃ汚いソースコードですが勘弁して下さい。。。すいません。。。