Close icon

アトトックラボ

2019月10日30日

Railsでrescue_fromを使ってエラー処理を共通化する

Railsのコントローラクラスのrescue_fromメソッドは、例外が発生した場合に実行するメソッドを指定できます。

コントローラーで独自のエラページをエラー内容によって切り替えたり、
APIでエラーが発生した場合に処理を共通化する場合などrescue_fromメソッドを使うとスッキリします。

ということで、APIのエラー処理の共通化を考えてみます。

各APIコントローラーのスーパークラス

各APIコントローラのスーパークラスを作成し、サブクラスで発生した例外は全てここでハンドリングします。
Api::TuleApiErrorが発生した場合、Api::ApiControllerのtule_api_errorメソッドが実行されます。
下記の例ではトークンが不正な場合は、HTTPステータスを401 Unauthorized、それ以外の場合は200 OKを返しています。
HTTPステータスは、例外の内容によって適切な値を設定します。

class Api::ApiController < ActionController::API
  include ActionController::HttpAuthentication::Token::ControllerMethods

  rescue_from Api::TuleApiError, with: :tule_api_error  

  protected
  # トークン認証
  def authenticate

  ・
  ・
  ・

  end

  private
  # エラー時のレスポンスを返す
  def tule_api_error(e)
  header = {result: e.code, message: e.message}
  response = {header: header}
  status = :ok
  status = :unauthorized if e.code == Api::Result::HTTP_TOKEN_ACCESS_DENIED
  render json: response, status: status
  end

end

上記のコードでApi::Resultはエラーコードを定義しているクラスです。

2019月09日10日

9月13日に第一回 RubyでLTしちゃわナイトのLTに登壇します

今週の金曜日、9月13日に都内(港区芝)で行われるイベント「第一回 RubyでLTしちゃわナイト」のLTに自分、サトウが登壇します。

何を話すかは会場に来ていただいた方のお楽しみ・・・とかいうとかっこいいですが、実はネタがいくつもあってどれを話そうかまだ考えているところ(要は決まってない)

2018月07日29日

Raspberry Pi の Rails で Hue をコントロールできるようにしてみた

土曜日の朝、仕事をしていたら最近あまり使っていない Raspberry Pi と本体ジャストサイズの多分 3.5 インチくらいのタッチパネルがあったので、書斎用に時計を作ってみました。

時計自体は HTML と JavaScript と CSS でなんとかなるなー、と思ったのですが、どうせなら部屋の照明(自宅の照明は基本的にほとんど Hue)もコントロールしたくなってしまって、じゃあ Rails で作ってみようと。なので HTML は haml、JavaScript ではなくて CoffeeScript で書いたんですが・・・。ちなみに時計の下に表示されている天気はテキトーに API 叩いて取ってるんですが、今回はそっちは端折ります。

そんなわけで Hue を Ruby から扱う方法の備忘録。

2018月07日20日

Visual Studio Codeでruby-debug-ideを使ってデバッグ

弊社の開発メンバーは、AtomやVisual Studio Code、Emacsなどそれぞれが好きなエディタを使用してRailsのアプリ開発を行なっています。

私は以前はAtomを使っていましたが、Atomにプラグインを入れすぎたからか重くなったので
ここ1年くらいはVisual Studio Codeを使っています。
Railsのデバッグはpryです。

Visual Studio Codeを使っていると右側にDebuggingアイコンが表示されています。
今まであまり気にしていなかったのですが
これ、どうやって使うんだと思い使ってみました。

2018月06日06日

Rails のルーティングをリソースの階層に合わせてネストさせる

あるある系の話でよく使うのだけど、なぜかよく忘れちゃったりもするのでメモも兼ねて書いておきます。

https://HOST/users/:id/diary/:id のようなルーティングを実現したい時の話です。

コントローラは users_controller、users のネームスペースの中に users/diaries_controller があると仮定します。

resources :users do
  scope module: :users do
    resources :diaries
  end 
end
2018月06日06日

RubyのNet::HTTPのリトライについて調べてみた

rubyでサーバーと連携するAPIを開発していてサーバーからの応答が遅い場合に、
リクエストが2回送信される現象があったのでNet::HTTPのリトライについて気になったので調べてみました。

サーバー側はRailsで作成しクライアント側は
下記のようにget methodでリクエストを送信するテストプログラムで確認します。

test_http.rb

require 'net/http'

uri = URI.parse("http://localhost:3000/hoges.json")
req = Net::HTTP::Get.new(uri.path)
res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.request(req)
end
2017月12日19日

配列をいろいろ回してみた

配列を回す方法がいろいろありすぎて・・・遊んでみました。

まず遊ぶための配列。

array = [1, 20, 30, 50, 100]

まず無難に each してみた。

total = 0
array.each do | value |
  total += value
end

puts total

次に for でやってみた。

tatal = 0
for i in array do
  total += i
end

puts total
2017月12日18日

enum で定義したい値を再利用したり f.select なんかで使うデータを生成してみたり。

以前 kurusaki さんが書いていた記事 をもうちょっと前に進めて、enum で定義した値を元に f.select ヘルパーなんかで表示する選択肢を生成するようにしてみました。みんな安心のローカライズ対応済みです。

ちなみにステータスはマスタ的に使えるように単体のクラスとして書いて、再利用できるようにしてみました。

2017月11日20日

Ruby で配列を freeze する話

Ruby で配列を freeze したかったら以下。

irb(main):001:0> LIST = ['001', '002', '003'].freeze
=> ["001", "002", "003"]

ただし上のコードで freeze されるのは LIST という配列オブジェクト自体で、配列の要素の値は freeze されない。

2017月11日13日

ActiveRecordのenum

ActiveRecordのenumが便利です。
enumを使用することで値の判定などわかりやすいコードが書けるようになります。
http://api.rubyonrails.org/v5.1/classes/ActiveRecord/Enum.html
例えば、Spotモデルに下書き(draft)と公開(published)の状態をもつステータスを追加するとします。

Spotモデルにstatusカラムを追加するマイグレーションを作成

rails g migration add_status_to_spot status:integer

Spotモデルにenumを追加

class Spot < ApplicationRecord
  belongs_to :prefecture
  belongs_to :area

  has_many :spot_photos
  has_many :spot_galleries
  validates :title, presence: true
  validates :prefecture_id, presence: true
  validates :area_id, presence: true
  validates :latitude, numericality: true
  validates :longitude, numericality: true

  enum status: { draft: 0, published: 1}
end

statusの値をenumで定義します。
statusが0の場合はdraft、1の場合はpublishedにします。


アトトックラボとは

株式会社アトトックメンバー が技術の話、デザインの話、キャラクターの話、ときどき脱線してガジェットの話やライフハックの話など好きなことを書いています。


連載記事


最近の記事


タグ