質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.47%

  • Ruby

    7967questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7509questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2456questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Ruby on Rails 5

    1986questions

  • API

    1565questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Ruby on railsで効率的にコードを書く方法について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 205

widget11

score 82

RubyOnRailsのController上でAPIを叩き、返ってきたJSONデータから必要なデータを取り出しメンバ変数に入れてview側で表示をするというアプリケーションみたいなものを作っております。
しかし困っている問題がございます。
端的に言いますと、取りたい値が多く、基本的にエンドポイントは同じなのですがその値の分オプション(id)の数が多い為、ルーティング、コントローラー、ビュー全部ひっくるめて非常にファットな状態になってしまうということです。

例えばですがとあるチェーン店の店舗ごとの従業員のリストが返ってくるAPIがあるとします。

http://example/v1/shop/playersというAPIのリクエストURLがあるとしたら

http://example/v1/shop/players/1 #横浜市店
http://example/v1/shop/players/2 #青森市店
http://example/v1/shop/players/3  #博多市店

といった具合に基本的にエンドポイントは同じで指定するプロパティ値(店舗ID)によって返ってくる、支店の従業員リストが異なるとします。

具体的に書くと、この店舗毎にデータを1つ1つ表示したい場合、現在の僕は以下のような処理を行うしか方法を知りません。

#ルート
Rails.application.routes.draw do
get 'abc/index' => 'abc#index'
get 'abc/index2'=> 'abc#index2'
get 'abc/index3' => 'abc#index3'
end
#コントローラー
class AbcController < ApplicationController

def index
#APIを叩き、横浜市の従業員リストを取ってくる
end

def index2
  #APIを叩き、青森市の従業員リストを取ってくる
end

def index3
  #APIを叩き、青森市の従業員リストを取ってくる
end
end
#index.html.erbファイル(横浜の店員を表示)
#index2.html.erbファイル(青森の店員を表示)
#index3.heml.erbファイル(博多に店員を表示)

例えば上のように3つのAPI/プロパティ(横浜、青森、博多のリスト)を呼ぶだけならこれでいいかもしれないのですが、これを200店舗分呼びたいとなると、、、
index,index2,index3,index4,index5...index200とルート、アクション、viewと書く量が非常に多くなってしまいます(力技で行こうと思えばいけますが。。。)

このような場合もう少し効率的にスッキリ書ける方法は何かないのでしょうか?

ルートはまだいいのですが、APIを叩いているコントローラー側が、数100のデータを呼ぶとなると非常に長々しいコードとなり、viewも仕方がないかもしれませんがhtml.erbファイルを逐次作成しコードを、貼り付けする作業と化していまいます。
APIをリクエストする際のオプションが違うだけで、その他コードは全て同じものなのでひたすらindexメソッドの中身をひたすらコピペしindex2、index3...と中に貼り付け、オプションだけ変えるという作業を行う形となり非常に歯がゆく辛いです。

如何せんプログラミング初心者な為効率的なコードをかけず日々苦悶しております。
何か少しでも効率化できる方法がございましたらご教授ください。
また回答が長くなりそうでしたら、ヒントとなる言葉やサイトをお教えいただけましたら、検索して調べる所存です。
宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

まずは「レールに乗る」、つまり、Railsの標準に則ったような作り方をしてみましょう。

  • コントローラー名はShopsControllerのように、複数形+Controllerにする
  • ルーティングはresourcesを使って、標準的なものを自動生成する

標準的なコントローラー+ルーティングを使った場合、params[:id]のような形でIDを取れるようになるので、1つ1つアクションを立てる必要もなくなります。

Rails のルーティング - Rails Guide

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/06 08:20

    「守破離」という言葉がありますが、標準的なやり方は「それが便利だから」標準になっているものです。まずはそれを使って、メリット・デメリットを確認してから自分独自のアレンジを加えていく、という方がいいでしょう。

    キャンセル

  • 2018/06/06 20:14

    ご回答ありがとうございます!
    もしよろしければですが具体的にどのようにindexアクションに書き込みコントローラーのメソッドに紐付ければよいのでしょうか?

    自分なりに調べてみたのですが、CRUDに纏わる情報は多いのですがindex(表示)アクションを多数紐付ける方法に関しては見つけられませんでした。
    回答者様が載せてくださったページの
    get '/patients/:id',
    等はヒントになりそうだと思ったのですが、、、お手数おかけしますがよろしくお願い致します。

    キャンセル

  • 2018/06/06 20:18

    案件を1つずつ出すアクションは、indexではなくshowアクションです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7967questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7509questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • Ruby on Rails 4

    2456questions

    Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

  • Ruby on Rails 5

    1986questions

  • API

    1565questions

    APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。