ブログ

読んで思い出す。忘れるために書く

コントローラに書かれた API へのリクエスト処理を lib/ に移行する (リファクタリング)

(外部API を利用しているコードの) テストコード... の書き方がわからなかったので Pull Request として作成するのはパス

でも手を動かしたので記録しておく

Q&A サイトでのやり取り (Ruby - RailsアプリをHerokuへデプロイ後、ぐるなびAPIが検索結果を返さない|teratail) で、ソースコードを公開していることを教えてもらえたので、質問で問題としている部分を見る機会が得られた

今回は コントローラにたくさん書かれていたそのコードを lib/ に移動したよ、というお話

まとめ

Rails は、その基本として MVC (Model, View, Controller) に則ってコードを書くけど、「gem として公開されてないけど 自分でちょっとしたライブラリを書く」という状況に面したときのために...? lib/ ディレクトリが用意されている

コード片を適切な場所に置ければ、「よし、あとは gem として登録・公開するか」という判断をするだけ、というコードを書いていけるかもしれない

あとから気付いたけど; コードを移動したのはいいものの、Kaminari の処理まで引き受けてしまっているのは greedy かもしれない

もとのコード

今回 書き換えに挑戦してみた、その前のオリジナルコードが次の参照先のコード

app/controllers/restaurants_controller.rb

書き換え後のコード

gist.github.com

エラー処理が大まかに2種類、入ってるので、その部分を改めてメソッドとして定義して yield を置くことで、利用側では「失敗するかもしれないけど 成功するときはこの処理をするよ」という書き方ができるようになった

実際に使う

Railslib/ を使うことを教える

config/application.rb

module RailsAppName
  class Application < Rails::Application
    # ...
    config.autoload_paths << Rails.root.join('lib')
    # ...
  end
end

lib/ にファイルを保存する

今回 GuruNaviApi とクラス名を定義したので、それに倣って guru_navi_api.rb としてファイルを保存する

コントローラ側から使う

class RestaurantsController < ApplicationController
  def index
    @restaurants =
      GuruNaviApi.search_restaurants(
        name: params[:name],
        freeword: params[:freeword],
        offset_page: params[:page]
      )
    # => 
    # [{:@attributes=>{:order=>0},
    #   :id=>"9999999",
    #   :update_date=>"2017-10-03T00:00:00+09:00",
    #   :name=>"お店の名前",
    #   :name_kana=>"オミセノヨミガナ",
    #   :latitude=>"00.000000",
    #   :longitude=>"000.000000",
    #   :category=>"バー",
    #   ...
  end
end

Links