(外部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
書き換え後のコード
エラー処理が大まかに2種類、入ってるので、その部分を改めてメソッドとして定義して yield
を置くことで、利用側では「失敗するかもしれないけど 成功するときはこの処理をするよ」という書き方ができるようになった
実際に使う
Rails に lib/
を使うことを教える
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