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