20210917のRailsに関する記事は10件です。

extend Activesupport::Concernについて

concernsに定義するモジュールでよく書かれているがいまいち何をしているのかよくわかっていなかったので調べました。 結論 単純に言えば、モジュールでのクラスメソッドの定義やそれをincludeする側でクラスメソッドとして追加する方法、クラスレベルでのメソッド呼び出しの容易な方法を提供してくれるものだと理解しました。 具体例 具体例は以下のページと同じものです。 https://api.rubyonrails.org/v6.1.4/classes/ActiveSupport/Concern.html 例えば、モジュールがincludeされたときに特定の処理を呼び出したり、モジュールのメソッドをクラスメソッドとして追加したい時、通常以下のように書きます。 module M # https://docs.ruby-lang.org/ja/latest/method/Module/i/included.html def self.included(mod) # includeする側(例えばクラス)の特異メソッドとしてClassMethodsを追加する -> クラスメソッドとして呼び出せる mod.extend ClassMethods mod.class_eval do before_action :xxx end end module ClassMethods # クラスメソッドを定義 end end ActiveSupport::Concernを利用すると以下のように書けます。 module M extend ActiveSupport::Concern included do before_action :xxx end class_methods do # クラスメソッドを定義 end end ActiveSupport::Concern内のicludedやclass_methodsなどのメソッドが面倒な記述を肩代わりしてくれ、簡潔に書けるようになります。 (extendしているのでMのクラスメソッドのように扱える)    また、モジュール間の依存関係もいい感じに整理して書けるようにしてくれます。 例えば以下の場合、HostクラスはBarモジュールをincludeしたいが、BarモジュールはFooモジュールに依存しているので、FooモジュールもHostがincludeしなければならない。 module Foo def self.included(base) base.class_eval do def self.method_injected_by_foo ... end end end end module Bar def self.included(base) base.method_injected_by_foo end end class Host include Foo # Hostが直接関係のないモジュールまでincludeしている include Bar end Barだけincludeしようとするとエラーになる。 class Host # include Foo include Bar end ==> undefined method `method_injected_by_foo' for Host:Class (NoMethodError) ActiveSupport::Concernを使うと依存関係の記述を綺麗に整理できます。 module Foo extend ActiveSupport::Concern included do def self.method_injected_by_foo ... end end end module Bar extend ActiveSupport::Concern include Foo included do self.method_injected_by_foo end end class Host include Bar end 参考 ActiveSupport::Concernが具体的に提供してくれるもの。(ソースコード) https://github.com/rails/rails/blob/83217025a171593547d1268651b446d3533e2019/activesupport/lib/active_support/concern.rb#L110
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

エラー:No route matches [GET] "/new_user_session_path"

環境 MacOS BigSur Ver11.5.2 Ruby 3.0.2 Rails 6.1.4.1 状況 Railsアプリを実装中、下記のエラー発生 No route matches [GET] "/new_user_session_path" 一見問題なさそう app/views/layouts/_header.html.slim li = link_to 'ログイン', 'new_user_session_path' pathを確認したけど間違ってない $ rails routes ... new_user_password_path GET /users/password/new(.:format) devise/passwords#new ... 解決方法 原因:pathを””で囲っていた… 初歩的なミスすぎて自分で自分に引きました app/views/layouts/_header.html.slim li = link_to 'ログイン', new_user_session_path 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Ralis でデータベースにあるテーブルの中身を指定して取得してviewに表示する方法

データベースのテーブルの中身を指定して取得。 テーブル名:lists カラム名:title def index @lists = List.find_by(title:"リスト") @lists_number = List.find_by(number:46) end あとはviewに記述すれば表示されます。 <%= @lists.title %> <%= @lists_number.title %>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

エラー:Could not find 'spring' (= 2.1.1) among 167 total gem(s) (Gem::MissingSpecError)

環境 MacOS BigSur Ver11.5.2 Ruby 3.0.2 Rails 6.1.4.1 状況 RailsアプリをHerokuへデプロイした際に下記のエラーが発生 Could not find 'spring' (= 2.1.1) among 167 total gem(s) (Gem::MissingSpecError) 原因 どうやらこのgemが悪さをしているらしい Gemfile group :development do (略) gem 'spring' gem 'spring-commands-rspec' end 疑問点 developmentだけのgemなのになぜデプロイ時にエラーが出るのか謎 解決策 この2つのgemをコメントアウト Gemfile group :development do (略) # gem 'spring' # gem 'spring-commands-rspec' end bundle installも忘れずに! デプロイし直すと正常にデプロイ完了! 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

結合テストを書いていく①

はじめに 単体テストコードはフリマアプリ作成時にしっかり書いたのですが、結合テストは書いていなかったのでオリジナルアプリでは書いていきたいと思います。 その中で学習したことをアウトプットとして投稿させて頂きます。 単体テストと結合テストの違い(単体テストの場合) 単体テストは機能ごとにテストを行います。 例えばuserの単体テストコードの場合 user_rspec.rb describe 'ユーザー新規登録' do context '登録できるとき' do it 'nickname,email,password,company_name,profession_idが存在する場合は登録ができる' do end end context '登録ができないとき' do end end モデルやコントローラーの機能ごとに問題がないかバリデーションの挙動を確認します。 単体テストと結合テストの違い(結合テストの場合) 結合テストの場合はユーザーがアプリを使用する一連の流れを確認するものになります。 ホームページ → 新規登録ボタンをクリック → 新規登録フォームに入力し完了ボタンをクリック → ホームページに遷移する この結合テストを実行するためにはSystem Specという技術を使用します。 この技術を使用するためにはCapybaraというGemが必要ですが標準で記載されているかと思われます。 ファイルの作成 実施にテストコードを記述していくためにファイルを作成します。 今回はユーザーについての結合テストコードを記述していきます。 ターミナル rails g rspec:system users これでファイルは作成されます。 それではexampleを整理していきます 新規登録できる場合を考えていきます。 この時のポイントは、「ユーザー目線で考える」ことです。あまり細かく考えずに、「ブラウザでどのような操作をすると、どうなるのか」を考えます。 spec>system>users_spec.rb require 'rails_helper' RSpec.describe "新規登録", type: :system do before do @user = FactoryBot.build(:user) end context 'ユーザーが新規登録ができる時' do it '正しい情報を入力すればユーザー新規登録ができてトップページに移動する' do # トップページに移動する # トップページにサインアップページへ遷移するボタンがあることを確認する # 新規登録ページへ移動する # ユーザー情報を入力する # サインアップボタンを押すとユーザーモデルのカウントが1上がることを確認する # トップページへ遷移したことを確認する # ログアウトボタンが表示されることを確認する # サインアップページへ遷移するボタンや、ログインページへ遷移するボタンが表示されていないことを確認する end end end 実際にはアプリを操作しながら書いていくと分かりやすいです。 次は実施にコードを書いていきます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ECSへのデプロイ時間を4分の1まで短縮した話

はじめに 最近、業務でECS、GitLab CI/CDを用いてCI/CDパイプラインを構築しました。 しかし、構築当初、非常に大きな問題に直面していました。それは、デプロイまでの時間が非常に遅いことです。 当初は、デプロイまでにかかる時間がテスト(CI)を除いても30分以上かかっており、非常に遅かったです。 しかし現在、改良に改良を重ね、ビルド、デプロイまでにかかる時間が7分ほどまでに短縮することができました。この記事では、具体的にどういった方法で早くしたのかを紹介します。 アプリケーションの構成とデプロイの流れ まず初めに、アプリケーションのざっくりとした構成と、デプロイまでの一連の流れを説明します。 アプリケーションの構成は主に、フロントエンドがVue.js、バックエンドはRuby on Railsで作られています。 デプロイまでの流れは以下の通りです。以下は非常に時間が遅かった、構築当初の流れです。 技術的にはGitLab CI/CD, Docker, シェルスクリプト, AWS ECS + Fargateを使い構築しました。 テスト実行(RSpec) イメージのビルドとプッシュ デプロイ実行(ECSタスク定義更新 & ECSサービス更新) どのように早くしたのか、紹介します。 [問題点①] assets:precompileが非常に遅い まず、デプロイする上で一番のボトルネックになっていたのがassets:precompileでした。 こちらは、jsやCSSなどをコンパイルするコマンドですが、当初、コンパイルが完了するまで19分ほどかかっていました。なので、デプロイの半分以上の時間がコンパイルに費やされていました。 [対応策①] コンパイルした内容をローカルにcacheとして保存しておく まずはじめにやったこととしては、前回コンパイルした内容をローカルに保存しておき、次にコンパイルを走らせる時にそのcacheを使わせるようにすることです。 Railsでは、コンパイルした内容はpublic配下に保存されるので、buildしたイメージからdocker cpでpublicの内容を抜き出し、次回のイメージのビルドの際のCOPY句でcacheをコピーするように改良しました。 id=$(docker create ビルドしたイメージ) docker cp $id:/app/public キャッシュの保存先(ホストのパス) docker rm -v $id 次回コンパイル時には、COPY句でソースコードを持ってくる際に、前回コンパイルされたpublicも一緒に持ってくるようにします。 (少し横道に逸れますが、publicフォルダは.dockerignoreで除外していたので、一度sedを使ってdockerignoreからpublicを消してbuildするようにしていました。) ただ、この方法だけだと速度の改善としては微妙でした。 そこで色々調べてみると、publicだけじゃなく、tmp/cacheというフォルダにもコンパイルされたcacheが保存されているらしいということを知り、こちらも保存するように変更したところ、コンパイルが結構早くなりました。 id=$(docker create ビルドしたイメージ) docker cp $id:/app/public CI/CDを動かしてるサーバのローカル docker cp $id:/app/tmp/cache CI/CDを動かしてるサーバのローカル docker rm -v $id しかしこれでもまだ問題がありました。それは、この方法では、前回のコンパイルから今回のコンパイルにかけて、Vue.jsのファイルやassets以下のファイルに変更があった際に、コンパイルが走ってしまい、遅くなることがあったことです。 つまり、この方法だと、前回と今回でコンパイル内容に差異がない場合は、非常に早くコンパイルが終わるが、差異がある場合はコンパイルが以前と比べ少し早くなったかな?というぐらいで全体的には遅いことに変わりないということです。 [対応策②] webpackを使用してコンパイルするように変更 そこで、railsのrakeタスクでコンパイルするのを止めて、yarn run webpackを使うように変更してみました。 すると、コンパイルが高速で終わるようになり、数十秒で終わるようになりました。正直これが一番効果がありました。 yarn run webpack --config config/webpacker/${RAILS_ENV}.js [問題点②] イメージのサイズが大きい 次の問題点はイメージのサイズが大きかったことです。 当初Dockerでローカルの開発環境を構築した際には、railsを動かすイメージのサイズは5GBを超えていました。リポジトリに大容量のデータファイルがあったことも原因の一つでしたが、Dockerfileの書き方にも問題がありました。 イメージのサイズが大きいと、以下のような問題が生じました。 ECRにプッシュするまでに時間がかかる。 ECSでタスクを動かした時にイメージをpullしてくるのに時間がかかる。 イメージのサイズを小さくするのに行った対処を紹介します。 [対応策①] RUNの数を最小限に まず、RUNの数を最小にすることでした。 当初は、コマンド一つにつきRUNを一つという感じで書いていました。(コードは適当です。) RUN apt-get update RUN apt-get install -y sudo ... RUN mkdir -p /app RUN bundle install RUNの数を最小にして、レイヤを減らした結果、数百MBぐらいは削減できたと思います。 この方法はデメリットもあるのですが、その一つがbuild時のエラーでどこでエラーになったか分かりづらいことです。また、Dockerfileの可読性も悪くなるので、イメージサイズとトレードオフになるかなと思います。 RUN apt-get update && \ apt-get install -y sudo ... && \ mkdir -p /app && \ bundle install ただ、サイズを軽くする上で一番手軽な方法でもあると思うので、一度やってみることは非常に有効だと思います。 [対応策②] 必要なパッケージの見直しとキャッシュの削除 まず、現状で必要なパッケージの見直しを行いました。 具体的には、環境を構築する上でインストールする必要がないパッケージを順次削除していきました。結果的にいくつかのパッケージが不要なことがわかり、数MBほどですが、サイズが小さくなりました。 次に、apt-getしたときのキャッシュの削除を行いました。 こちらは、公式のDockerfileベストプラクティスで紹介されていた内容を用いているのですが、apt-get cleanとrm -rf /var/lib/apt/lists/*を加えました。また、apt-get install時に--no-install-recommendsオプションを付け加えました。 RUN apt-get update && apt-get install -y --no-install-recommends \ sudo \ # (中略) && apt-get clean \ && rm -rf /var/lib/apt/lists/* こちらもごくわずか(数十MBぐらい?)ですが、イメージを軽くできました。 [対応策③] multi stage buildを利用 イメージのサイズを軽量化する上で一番効果があったのがmulti stage buildを使うことでした。 具体的にはbundle installとyarn installをインストールするステージを分けました。最新版のdockerを使っていると、ステージごとに並列に処理してくれるので、buildも大分早くなりました。 また、bundle install用にインストールしていたg++やqt4-qmakeなどは、bundle installのステージのみでインストールするように変更してイメージを軽くすることができました。 具体的なコードは以下の通りです。 FROM ruby:2.7.2 AS gem_installer RUN apt-get update && \ apt-get install -y --no-install-recommends g++ qt4-qmake libqtwebkit-dev && \ mkdir -p /app COPY ["./workspace/Gemfile", "./workspace/Gemfile.lock", "/app/"] WORKDIR /app RUN bundle install FROM node:10.24.0 AS webpack_builder RUN mkdir /app WORKDIR /app ENV NODE_ENV development COPY ["./workspace/app/package.json", "./workspace/app/yarn.lock", "/app/"] RUN yarn install FROM ruby:2.7.2 ENV QMAKE="/usr/bin/qmake-qt4" ENV BUNDLER_VERSION=2.1.4 RUN apt-get update && \ apt-get install -y --no-install-recommends nodejs default-mysql-client sudo npm vim fonts-ipa* ssh cron && \ apt-get clean && \ rm -rf /var/lib/apt/lists/* && \ curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - && \ echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list && \ sudo apt update && \ sudo apt -y install --no-install-recommends yarn && \ npm i npm@latest -g && \ npm install webpack-dev-server -g && \ gem update --system && \ echo "gem: --no-rdoc --no-ri" > ~/.gemrc && \ gem install 'bundler:2.1.4' 'rails:5.2.5' 'mailcatcher' 'git' 'spring' && \ mkdir -p /run/sshd /tools && \ ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime WORKDIR /app COPY ./web/git.rb /tools/ COPY --from=gem_installer /usr/local/bundle /usr/local/bundle COPY --from=webpack_builder /app/node_modules /app/node_modules [対応策④] alpineイメージを使用する こちらは実際にはまだ対応できていませんが、イメージを軽くする上では非常に効果が高いと思いますので紹介いたします。 alpine linuxという非常に軽量なOSをベースにして作られたイメージを使用すると、800MBほど軽量化ができました。 ただ、一度入れようかとチャレンジしたのですが、apkという独自のパッケージ管理を使用しており、結構取っ付きづらかったです。さらに、必要最小限のパッケージのみに絞られているため、shしか入っておらず、触りはじめの頃は大分苦戦しました。 結局、残念ながらbundle installのcapybaraをインストールするところで必ずエラーになり、導入には至れませんでした。 FROM ruby:2.7.2-alpine プロジェクトの初期などにイメージを構築する際には、alpineを使用した構築をおすすめいたします。 9/17 追記 alpineを安易に使用するのはやめておいた方が良いという記事もあるようです? 記事ではDistoressイメージというイメージの利用をおすすめしているようです。代わりに、こちらの方を使ってみても良いかもしれないですね。(私は全く知りませんでした。。) パイプラインの最適化 並列で処理 こちらはマシンのリソース的な問題でまだできていませんが、CI/CDパイプラインで並列に実行できる箇所を今後並列化してゆきたいと思っています。具体的には、「イメージのビルド後、ビルドした内容をホストにキャッシュ」する部分と「イメージをECRにプッシュする処理」は、互に独立しているので、並列で実行ができます。これが実現できれば、さらにCI/CDの時間を短縮することができそうです。 結果的にパイプラインの流れは以下のようになりました。 終わりに こんな感じの対応を行い、デプロイの時間を30分超→8分ぐらいまで短縮できました。非常に長い苦労を伴いましたが、ここまで短縮できてよかったです。 是非参考にしてみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ドロップダウンでboolean型の値を扱う方法

基本的にboolean型の値をドロップダウンで表示することはないと思うんですが、仕事でそうしないといけない状況があり、手こずったので書き留めておきます。 したいこと:”10日”と”1日”のドロップダウンを作る。10日を選んだ時はtrue、1日を選んだ時はfalseをデータベースに送信する。 まずはerbファイル。最初はrequired: trueを書いていたのだけど、うまく動作せずinclude_blankに変更。 qiita.html.erb <div class="form-group"> <%= f.label :pay_day %> <%= f.select :pay_day, payment_day, { include_blank: false }, class: "form-control" %> </div> modelファイルにメソッドを追加。trueとfalseはkeyとして使えないのでinvertを使って逆に書くことに。これをしないとrubocopエラーが、、、 qiita.rb PAYMENTDAY = { "10日": "true", "1日": "false" }.invert.freeze erbに記載していたpayment_dayメソッドをapplication_helperに追加。 select_fieldは配列で値を受け取る必要があるため、keyとvalueをループさせmapメソッドに入れる。 application_helper.rb def payment_day QIITA::PAYMENTDAY.map { |k, v| [v, k] } end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsのScaffoldを使って3分でwebアプリを作ってみる

Ruby on Railsのscaffoldを使って最速でwebアプリケーションを構築してみます。 Scaffoldとは まずはRuby on Railsのscaffoldとは何かについて解説します。 scaffoldとは、Railsに備わっているコマンドの1つで、ルーティングやコントローラー(controller)、ビュー(view)、モデル(model)とテーブル(データベース)の記述やファイルなどを自動で作成してくれるコマンドです。 本来、scaffoldは建築現場の足場やビルの窓を拭くときに使用される吊り足場を意味します。Ruby on Railsのscaffoldにおいても、アプリケーションの足場であるMVC(上記で紹介したModel-View-Controller)等を指し示し、それらを容易に自動生成できます。 つまり、scaffold を使用することで、コントローラーやモデルを作成する手間を省くことができます。 scaffoldを使って作成されるルーティングは、Railsが定める7つのアクションになります。(index・show・new・edit・create・update・destroyアクションの7つです。) 以上がRails scaffoldについての簡単な説明になりますが、さすがにこれだけでは分かりにくいので、以下からは実際にRailsのscaffoldを使って、WEBアプリケーションを作ってみます。 実装 実際にScaffoldを使ってアプリケーションを作ってみます。 まずはターミナル上で次のコマンドを打ち込みます。 rails new testapp 次にディレクトリを移動します。 cd testapp ここからScaffoldを利用します 【scaffoldのコマンド書式】 rails g scaffold モデル名 カラム名①:データの型① カラム名②:データの型②・・・ 上記の書式に沿って、モデル、カラムを設定しましょう。 今回は簡単にTweetモデルにcontentカラムのみをのっけて書いてみます。 rails g scaffold Tweet content:string このコマンドでmodel、controller、viewすべてが作成されました。 最後に rails db:migrate こちらを打ち込みmigreteします。 これで完成です。驚く程かんたんですね。 動作確認 最後に、どんなものが完成したのかを確認します。 まずは、アプリのディレクトリ上で rails s と打ち込みます。 起動が確認できたら、Chromeなどのブラウザで http://localhost:3000/tweets 上記のURLを直接入力します。 このような画面が出たら成功です。 画面上の NewTweetから飛び、 なにか投稿を入力してみましょう。 投稿がうまくいけば下記のような画面になるはずです。 編集や削除などの機能も勝手に実装されていることが分かります。 まとめ 今回Scaffoldを使ったwebアプリケーション構築のかんたんな例を示してみました。 大規模なアプリ開発時にはあまり使えませんが、軽くテスト用のアプリを作りたかったり、 個人開発の小規模なアプリであれば開発スピートに大きく貢献してくれる便利な機能だと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails newしてからsourcetreeを用いたGitの管理方法

CLIは初心者殺し 誰しも最初に思うこと ターミナルでコマンド打ちながらGit管理するの普通に無理。 最近Gitについておぼろげながら理解してきたけど、初心者はGUIを用いて管理した方が精神衛生上良い。異論は認める。 なんとなく理解できてきたのはsourcetreeくんのおかげと言っても過言ではない。 この記事では、初心者向けにsourcetreeを用いたGitの管理手順をザックリとご紹介します。 あくまでも個人的なやり方なので、参考程度に。 rails newからsourcetreeとGitHubの紐付けまで プロジェクトを作成 rails new 任意名 (バージョンを指定しながらnewをするには以下を実行する rails _6.0.4.1_ new 任意名 ) ディレクトリをVSCodeで開く code . sourcetreeを開いて「メニューバー→開く」からディレクトリを参照 全てのファイルを選択してコミット initial commit GitHubで新規リポジトリを作成「プロジェクト名→ディスクリプション→create」 リポジトリのSSHをコピー sourcetreeを開き「設定→リモート→追加」から、リモートの名前:origin・URL/パス:コピーしたSSHとする mainブランチを右クリックしてoriginにプッシュ GitHubを開いてリポジトリにRailsのファイル群が追加されていれば完了 おわり これでハッカーが使う黒い画面()を触らなくてもGUIで管理できるよ。 みんなも毎日一緒に草を生やそうね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails】Web APIの作り方を詳しく解説!

はじめに 以前にこんな記事を投稿しました。 【3分で出来る】Ruby on RailsでWeb APIの作成 この記事で解説したように、Ruby on Railsは本当に優秀なフレームワークで、簡単なAPIだったら数分で作れちゃうんです。 しかし前回は3分で作ったAPIを実際に動かして試してみたというだけで、ソースコードの中身までは解説しませんでした。 今回はソースコードを見ながら、Ruby on Railsで作ったAPIが動く仕組みを見ていきます。 前回作成したAPIがある状態で解説を行うので、まだの方は上記リンクを見て作ってみてください。5つのコマンドを打つだけで終わります。 前提知識 APIとは JSON HTTPリクエスト、レスポンス GET, POST, DELETE, etc… 環境 ruby 2.6.5 Rails 6.0.2 macOS Catalina 10.15.3 Rails APIの仕組み 前回の記事で一通り作ったAPIを試しましたが、以下の表を覚えていますでしょうか。 メソッド パスhttp://localhost:3000/ の続き 効果 GET users 全件取得 POST users bodyのjsonでデータ投入 GET users/:id 該当idのデータを取得 PATCH users/:id 該当idのデータをbodyのjsonで更新 PUT users/:id 該当idのデータをbodyのjson更新 DELETE users/:id 該当idのデータを削除 1行目を例にして、なぜhttp://localhost:3000/users/ にGETリクエストを送るとユーザ情報が全件取得できるのかなど見ていきましょう。 ルーティング Railsを触ったことがある人はルーティングを知っているでしょう。 /config/routes.rbにルーティングが記述されています。開いてみてみると以下のように記述されています。 Rails.application.routes.draw do resources :users # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end 「あれ?こんなの書いた覚えはないぞ」と思うかもしれませんが、以下のコマンドを打った際に生成されたものです。 $ rails g scaffold user user_id:string password:string scaffoldは必要なものを一通り作ってくれるのでuserに関するものを一通り作成してくれました。その中の一つがルーティングです。 ではルーティングの中にあるresources: usersとはどういう意味でしょうか? Rails.application.routes.draw do resources :users end これは以下と同じことを意味します。 Rails.application.routes.draw do get 'users' => 'users#index' get 'users/:id' => 'users#show' get 'users/new' => 'users#new' post 'users' => 'users#create' get 'users/:id/edit' => 'users#edit' patch 'users/:id' => 'users#update' delete 'users/:id' => 'users#destroy' end これ、冒頭に書いた表と大体一致しますよね。(余計なものもありますが) get 'users' => 'users#index'は http://localhost:3000/users/ にGETリクエストを送ったときは(get 'users') usersコントローラのindexアクションを実行しろ('users#index') という意味です。 ではusersコントローラのindexアクションを見てみましょう。 コントローラとアクション usersコントローラは/app/controllers/users_controller.rbにあります。 中を見てみるとindexメソッドが見つかると思います。これがindexアクションです。 class UsersController < ApplicationController before_action :set_user, only: [:show, :update, :destroy] # GET /users def index @users = User.all render json: @users end # 以下省略、、、 ちなみにこのコントローラやその中身も作った覚えがないと思いますが、$ rails g scaffold user user_id:string password:stringのコマンドで生成されたものです。scaffoldすごい! indexアクションの中身を見てみると ユーザをすべて取得して(@users = User.all) jsonにして返す(render json: @users) となっています。 以上のルーティング、コントローラ、アクションを踏まえると、なぜhttp://localhost:3000/users/ にGETリクエストを送るとユーザ情報が全件取得できるのか分かったのではないでしょうか。 他に関しても同様です。 自分のオリジナルに作り変える APIは以下の動きをすると書いていますが、これはあくまでもscaffoldのコマンドに任せて作成した場合の話です。 メソッド パスhttp://localhost:3000/ の続き 効果 GET users 全件取得 POST users bodyのjsonでデータ投入 GET users/:id 該当idのデータを取得 PATCH/PUT users/:id 該当idのデータをbodyのjsonで更新 DELETE users/:id 該当idのデータを削除 例えば usersコントローラのindexアクションの中身をいじれば、全件取得ではなくidの昇順に並べたときの上から10個だけ取得するようにできる usersコントローラのcreateアクション(post ‘users’)をいじれば、パスワードを暗号化する処理をしてからデータベースに格納するようにできる というかrails g scaffoldのコマンドを使う必要もありません。routes.rbにルーティングを記述し、該当するコントローラとアクションに自分がさせたい処理を書くだけです! さいごに Ruby on Railsで作ったAPIの中身を解説しました。非常にシンプルな作りだったためわかりやすかったかと思います。 作りは違いますが、どの言語やフレームワークでも基本的には同じです。あなたの独自のAPIを作ってみましょう!ランダムに運勢をjsonで返すAPIとか。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む