Ruby on Rails (3.x >= 3.2.9) のためのブログです (どっちかというと社内ブログ的な感じで、基礎から書いてきます) 。
12月
13
Comments


Model, View, Controller のフレームワークに、サービス層を付け加えたほうがいいのでは〜?という記事をこの前書きました。

RAILSでのアプリケーション作成 - MVC

そこで、

  • app/services 以下に指定した名前のサービスクラスを作成
  • test/unit 以下に作成したサービスに対するTest用クラスを作成
以上の機能を持ったrakeコマンドを作成しました。
以下のスクリプトを, lib/tasks の中に作成してください (ファイル名は service.rake)



  1. # encoding: utf-8  
  2. # サービスクラスを作成する  
  3. # app/services以下  
  4. #  
  5. # rake service:create SERVICE="hoge"  
  6. #   このコマンドで、app/services/hoge_service.rbが作成 class名はHogeService  
  7. namespace :service  do  
  8.   
  9.   # service ファイルの作成  
  10.   task :create do  
  11.     service_file_name = ENV['SERVICE'].to_s  
  12.   
  13.     if service_file_name != "" and File.extname(service_file_name).empty? then  
  14.   
  15.       service_file_name = service_file_name + "_service"  
  16.       services_dir = File::expand_path('./app/services');  
  17.   
  18.       # services ディレクトリがなかったら作成  
  19.       FileUtils.mkdir_p(services_dir) unless FileTest.exist?(services_dir)  
  20.   
  21.       service_file_path = services_dir + "/" + service_file_name + ".rb"  
  22.       classname = convert_to_camelcase(service_file_name)  
  23.   
  24.       if make_service_class(classname, service_file_path) then  
  25.         print "\e[34m" + "app/services/" + service_file_name + ".rb\e[0m" + "を作成しました。\n"  
  26.   
  27.         # UnitTest用のクラス作成  
  28.         test_services_dir = File::expand_path('./test/unit');  
  29.         test_service_file_path = test_services_dir + "/" + service_file_name + "_test.rb"  
  30.   
  31.         if make_service_test_class(classname, test_service_file_path) then  
  32.           print "\e[34m" + "test/unit/" + service_file_name + "_test.rb" + "\e[0m" + "を作成しました。\n"  
  33.         end  
  34.   
  35.       else  
  36.         print "\e[41m" + "既に指定したサービスが存在しています。" + "\e[0m\n"  
  37.       end  
  38.     else  
  39.       print "\e[41m" + "正しい SERVICE パラメータを指定して下さい。" + "\e[0m\n"  
  40.     end  
  41.   end  
  42.   
  43.   def convert_to_camelcase(str)  
  44.     return str.split('_').map{|s| s.capitalize}.join('')  
  45.   end  
  46.   
  47.   def make_service_class(service_class_name, filepath)  
  48.   
  49.     if !FileTest.exist?(filepath) then  
  50.   
  51.       test_program = <<EOS  
  52. # encoding: utf-8  
  53.   
  54. class %%CLASS_NAME%%  
  55. end  
  56. EOS  
  57.       test_program = test_program.sub("%%CLASS_NAME%%", service_class_name)  
  58.       f = open(filepath, "w")  
  59.       f.write(test_program)  
  60.       f.close()  
  61.   
  62.       return true  
  63.   
  64.     else  
  65.       return false  
  66.     end  
  67.   end  
  68.   
  69.   def make_service_test_class(service_class_name, filepath)  
  70.     if !FileTest.exist?(filepath) then  
  71.       test_program = <<EOS  
  72. # encoding: utf-8  
  73.   
  74. class %%CLASS_NAME%%Test < ActiveSupport::TestCase  
  75. end  
  76. EOS  
  77.       test_program = test_program.sub("%%CLASS_NAME%%", service_class_name)  
  78.       f = open(filepath, "w")  
  79.       f.write(test_program)  
  80.       f.close()  
  81.   
  82.       return true  
  83.   
  84.     else  
  85.       return false  
  86.     end  
  87.   end  
  88. end  
このファイルを作成し、

$ rake service:create SERVICE="hoge_hoge"


とすれば、

  • app/services/hoge_hoge_service.rb が作成されます。 
  • 同時に、test/unit/hoge_hoge_service_test.rb が作成されます。 

ちょー適当に作りましたが、メモ残しておきます。 ノリで、rakeの独自タスクの作成テストとして作っただけなので、めちゃくちゃ汚いソースコードですが勘弁して下さい。。。すいません。。。


Categories: , , , ,

Leave a Reply