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


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


Categories: , , , ,

Leave a Reply