validationエラーをif分等で対応するのがだるいのでraiseで対応した

check関数を、modelに実装

checkを呼ぶと、validationがうまく行ってない場合、raiseし死んじゃうようにした。

module Bei
  require 'pp'
  require 'bei/exception'
  class ActiveRecord < ActiveRecord::Base
    self.abstract_class = true

    def check
      if self.invalid?
        e = Bei::Exception::Validation.new()
        e.errors = self.errors
        raise e
      end

    end

    def check_and_save
      self.check
      self.save
    end

  end
end

Exceptionクラス

Exceptionをちょっと継承した感じ。

module Bei
  class Exception < ::Exception

    class Validation < ::Exception
      attr_accessor :errors
    end

  end
end

Controllerのベースクラスを拡張

エラーをキャッチして、いい感じに、自動でJSONで出力。今回はAPI用に作ってるので、HTMLは考慮してない。

class ApplicationController < ActionController::Base
  require 'pp'
  require 'bei/exception'

  rescue_from Bei::Exception, :with => :catch_exception
  rescue_from Bei::Exception::Validation , :with => :catch_validation_exception

  def render_json_ok(args)
    render :json => { 'error' => 0 , 'data' => args }
  end

  def render_json_error(code,args)
    render :json => { 'error' => 1,'error_code' => code , 'data' => args }, :status => 400
  end

  private


  def catch_exception(e)
    code =  e.message
    render_json_error(code,{})
  end

  def catch_validation_exception(e)
    # TODO errors.messages の最適化
    render_json_error('VALIDATION_ERROR',e.errors.messages)
  end

end


これで、validation毎に、if条件分を書かなくてすむので楽チンなはず!

4/24 土曜日はタコthonです

タコthonとは、たこ焼き食べたり、プログラミングしたり、WAF作ったり、
ゲームしたり、サービスを企画したりとかする会合です。是非参加してもらえればと!

場所

神奈川県 溝の口からバス

集合時間

今週の土曜日の12:00 - 13:00ぐらい

参加条件

  • id:tomyhero とマイミク
  • かわいい子
  • 暇な人
  • 社長
  • CTO
  • 勝ち組

参加予定者

タコさんウィンナーthonに参加してきました

タコさんウィンナーをこよなく愛する id:vkgtaro id:hideden id:dann さん達とタコさんウィンナーを愛でてきました。以下おいしそうな、タコさんウィンナーの花です。

http://farm5.static.flickr.com/4060/4530934156_3a77da2f17.jpg

今年もみなさんのお弁当を賑わしてくれそうですね!

http://farm5.static.flickr.com/4025/4530876280_1079216a8f.jpg

その他写真はこちら