Rails関連のことを調べてみた2021年09月17日

Rails関連のことを調べてみた2021年09月17日
目次

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

## はじめに
最近、業務でECS、GitLab CI/CDを用いてCI/CDパイプラインを構築しました。
しかし、構築当初、非常に大きな問題に直面していました。それは、**デプロイまでの時間が非常に遅いこと**です。

当初は、デプロイまでにかかる時間がテスト(CI)を除いても**30分以上**かかっており、非常に遅かったです。

しかし現在、改良に改良を重ね、ビルド、デプロイまでにかかる時間が7分ほどまでに短縮することができました。この記事では、具体的にどういった方法で早くしたのかを紹介します。

### アプリケーションの構成とデプロイの流れ
まず初めに、アプリケーションのざっくりとした構成と、デプロイまでの一連の流れを説明します。

アプリケーションの構成は主に、フロントエンドがVue.js、バックエンドはRuby on Railsで作られています。

デプロイまでの流れは以下の通りです。以下は非常に時間が遅かった、構築当初の流れです。
技術的にはGitLab CI/CD, Docker, シェルスクリプト, AWS ECS + Fargateを使い構築しました。

1. テス

元記事を表示

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

基本的にboolean型の値をドロップダウンで表示することはないと思うんですが、仕事でそうしないといけない状況があり、手こずったので書き留めておきます。
したいこと:”10日”と”1日”のドロップダウンを作る。10日を選んだ時はtrue、1日を選んだ時はfalseをデータベースに送信する。

まずはerbファイル。最初はrequired: trueを書いていたのだけど、うまく動作せずinclude_blankに変更。

“`ruby:qiita.html.erb

<%= f.label :pay_day %>
<%= f.select :pay_day, payment_day, { include_blank: false }, class: "form-control" %>

“`
modelファイルにメソッドを追加。trueとfalseはkeyとして使えないのでinvertを使って逆に書くことに。これをしないとrubocopエラーが、、、

“`ruby:qiita.rb
PAYMENTDAY = {

元記事を表示

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・creat

元記事を表示

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で新規リポジトリを作成

元記事を表示

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

# はじめに
以前にこんな記事を投稿しました。
[【3分で出来る】Ruby on RailsでWeb APIの作成](https://qiita.com/ruemura3/items/4e99a968b18b49829301)

この記事で解説したように、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の仕組み

元記事を表示

【初心者向け】初めての模写コーディングで役立つ豆知識・学習メモ(9/16)

#学習内容
– HTML/CSSコーディング練習
– Railsアプリ開発2周目突入(rails new)

##学んだこと
###HTML/CSSコーディング練習
####flex関連
– flex, flex-wrap, justify-content, aligin-itemsは親要素に付ける
– 複数の要素を横並びにしたいときは親要素にdisplay: flex;を指定する
– 要素の間隔を広げたい場合はgap: ○○px;で指定すれば簡単
– また、画像とテキストを横並びにするときは子要素の両方にwidth: 100%;を付ける

####ボタン関連
– ボタンを中央寄せしたいときはdisplay: block;とmargin: auto;を指定する
– display: block;を付けてブロック要素に変更
– paddingで余白をとる
– cursor: pointer;と擬似要素でopacityを指定すれば、よりボタンっぽくなる
– ボタンの原型クラスと色付けクラスで分けると汎用性アップ

####inputタグ関連
– inputタグを中央寄せするときはwidth

元記事を表示

[Rails]Gemを使ってモーダル作成

# はじめに
本記事では、Gemを使ったモーダルの作成方法を記述します。

## 参考動画
ブックマークしているサイトがもろ見えになるので、上は切りました。
「決して」やましいものはありません。

![05adb4091ab2c978dffd22ddbd5045d2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1768158/8bcc6b41-7ff5-2a27-ae1e-b4c7ebb3a7b4.gif)

# 流れ

`gem`のインストールです。

“`ruby
gem ‘data-confirm-modal’
“`
からの

“`
bundle install
“`
からの

“`application.js
// = require data-confirm-modal
コメントアウトでOK
“`

“`erb
<%= link_to food_path(food.id), method: :delete, data: { confirm: '本当に削除しますか?削除すると

元記事を表示

知っておきたいincludesの正体【Rails】

rails 6.0.2
ruby 2.7.1

# includesとは

N+1問題を起こさないように、関連テーブルのデータをキャッシュしてくれるメソッド。
しかし、関連テーブルのデータをキャッシュするといっても
一体どのようにして、データを取得してきているのだろうか。

実はincludesは、モデルの関連など見て以下のどちらかの最適とrailsが判断したメソッドを実行している。
(このrailsの判断が正しいとは限らない。*後述)

preload|eager_load|
—|—|
|関連ごとにSQLを発行してキャッシュ。 |left_joinを用いて、キャッシュ。|

preload、eager_loadがどの様なSQLを発行してるか見ていく。

以下の様なモデルがあるとする。

“`ruby:user.rb
class User < ApplicationRecord belong_to :country #国 has_many :posts #投稿 end ``` ## preload preloadは、関連ごとにSQLを発行してキャッシュする。

元記事を表示

Dockerの開発環境から踏み台サーバー経由でdbに接続 [ Rails ]

## 目的
開発マシン上のdockerで動作するrailsアプリケーションのdb接続を
踏み台サーバー経由でrdsに接続したい。

![スクリーンショット 2021-09-16 13.39.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664524/7e161536-c88b-ddea-3bdc-cf7143806244.png)

## 方法
### 前提
◦踏み台サーバー
・エンドポイント ip: 12.12.12.12
・pemファイル /Users/hoge/.ssh/hoge.pem
・接続ユーザー root
◦dbサーバー
・エンドポイント private domain: hogehoge.internal (踏み台から見て)
・postgreSQL(portは、5432)

① macターミナルから以下コマンドを実行、SSHポートフォーワーディングを行う。

“`shell
ssh -N -L 5434:hogehoge.internal:5432 -i

元記事を表示

railsチュートリアル 第五章 html 

##レイアウトを確認する
この章では、アプリケーションに“`Bootstrap“`フレームワークを組み込み、
、カスタムスタイルを追加。
これまで作成したページ(HomeやAboutなど)へのリンクをレイアウトに追加。
“`パーシャル“`
Railsのルーティング
Asset Pipeline
Sassを学習する。
章の最後に、ユーザーをサイトにログインさせる

サンプルアプリケーションにレイアウトを追加、修正の部分に注力
本章ではテキストエディタによる修正とブラウザによる確認がほとんど。
最後に、新しいテスト手法“`「統合テスト(Integration Test)」“`について紹介
統合テストを使って、最終的なレイアウトやリンクが正しいかどうかをチェック。

###構造を追加する
レイアウトにいくつかの構造とCSSを与えて、最小限のスタイルを追加。
カスタムCSSルールの他に、Twitter社によるオープンソースのWebデザインフレームワークとして公開している“`Bootstrap“`も利用します。また、コードそのものにもスタイルを与えます。
つまり、散らかり始めたレ

元記事を表示

【Rails】同名のパスのviewで表示するインスタンスを使い分ける

rails初学者によるポートフォリオ作成中の学びのアウトプットです。

#実現したい事
クイズアプリを作成中に複数のモードを全てquestionモデルとanswerモデルで賄いたい(ジャンルAのクイズ集とジャンルBのクイズ集を実装する)。下記の二つのページのようにnew_answer_pathからアクセスした時に異なるジャンルの問題が表示されるようにしたい。

(モードA)

ジャンルAの問題を表示

回答欄(answerモデルに保存される)

(モードB)

ジャンルBの問題を表示

回答欄

#実装の流れ
①questionモデルにmode_numカラム(integer)を追加して問題のジャンルを番号で識別するようにする。

②new_answer_path(mode_num: <識別番号>)とし、newアクションにmode_numを渡すようにする。

③newアクションで渡された識別番号からquestionモデルを検索するよう実装する。

#実際のコード

(②のステップから)
問題ジャンルAはquestion.mode_numを1に設定。
問題ジャンルBはquestion.m

元記事を表示

行単位でRubocopを無効にする方法

##行ごとに無効にする場合
行末にコメントアウトで`# rubocop:disable ルール名`を記述する。

例.

“`Ruby
~処理~ # rubocop:disable Rails/OutputSafety
“`

## 複数行にまたがって無効にする場合
ルールを無効にしたい処理の前後を以下の様に囲む。

例.

“`Ruby
# rubocop:disable Rails/OutputSafety
~処理~
# rubocop:enable Rails/OutputSafety

“`

元記事を表示

ユーザーごとの投稿一覧を表示させたい

患者(user)ごとの記録一覧ostomy(index)を医療者(admin)が見れるようにしたいが、nullデータが持ってこれない

“`ruby:Staff/Ostomies.controller.rb
class Staff::OstomiesController < ApplicationController before_action :authenticate_staff! def index #患者さんごとのindex @ostomies = Ostomy.where(patient_id: params[:patient_id]) end ``` ```ruby:routes.rb namespace :staff do #医療者のコントローラー内 : resources :ostomies,:only => [:show],:index] do  #患者さんが書いた記録
resources :comments, only: [:create, :destroy] #記録へのコメント

元記事を表示

Rails の Custom Validator を RSpec で柔軟かつ簡単にテストする方法

# はじめに
カスタムバリデータのテストを RSpec で記述するにあたり、いくつかの技術記事を参考にしたが、どれも一部情報が欠けているものばかりだった。

そこで、カスタムバリデータのテストの書き方について、個人的につまずいた部分を解消したものをまとめておく。

# 目標
以下のようなカスタムバリデータがあり、そのテストコードを RSpec で記述できるようにする。

“`ruby:app/validators/inclusion_in_array_validator.rb
# frozen_string_literal: true

# 配列の中身に特定の値が含まれている、または、特定の値の範囲内かを検証するカスタムバリデーション
class InclusionInArrayValidator < ActiveModel::EachValidator def validate_each(record, attribute, value) return if value.all? { |v| options[:in].include?(v) } rec

元記事を表示

[Rails] jQueryの導入

以下、Ruby on Rails 6.0.0における
jQueryのインストール方法です。

1. gemの導入
2. application.jsに記述追加
3. application.html.erbのhead部に記述追加
4. 任意の内容で動作確認

#1. gemの導入

以下の記述を追加し、bundle installを打ちます。

“`ruby:Gemfile
gem ‘jquery-rails’
“`

#2. application.jsに記述追加

ディレクトリがない場合は
apps/assets/javascripts/application.js
作成します。

“`ruby:app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
“`

#3. application.html.erbのhead部に記述追加
以下の一行を追加します。

“`ruby:views/layouts/application.html.erb

#(中略)

元記事を表示

cannot load such file — rexml/documentと出た時の対処法!

環境

macOS Big Sur 11.5.2
rails 6.1.4
railsチュートリアル6章学習中

実行

“`
$ rails test:models
“`
エラー

“`
rails aborted!
LoadError: cannot load such file — rexml/document
“`
解決法

Gemfileに

“`rails:Gemfile
gem ‘rexml’
“`
を追加し

“`
$ bundle install
“`
再度

“`
$ rails test:models
“`

“`
Run options: –seed 62060

# Running:

.

Finished in 0.316916s, 3.1554 runs/s, 3.1554 assertions/s.
1 runs, 1 assertions, 0 failures, 0 errors, 0 skips
“`
できました!

元記事を表示

【Rails】TypeError (nil can’t be coerced into Integer):の対処法

症状

RailsAPIモードでメソッド作成し叩いたところ、以下のエラーが表示されてしまいました。

翻訳すると、「TypeError(nilを整数に強制変換することはできません):」でした。
nilを整数に変換しようとして、失敗しているようです。

“`terminal:error
Completed 500 Internal Server Error in 21ms (ActiveRecord: 0.4ms | Allocations: 18292)

TypeError (nil can’t be coerced into Integer):

app/controllers/hoges_controller.rb:112:in `+’
app/controllers/hoges_controller.rb:112:in updateHoge
“`

該当のメソッドは以下です。

paramsからidを受け取り、DBからHogeを検索。
その検索したHogeのvaluationとparamsからvaluationを受けとり、その二つの値の平均値を再度Hog

元記事を表示

ActiveStorage と variant と それから N+1

## 概要と対策手順
1. `Active Storage`を使ってポートフォリオを作成
1. 作成後のレビューで`Active Storage`で`N+1`を確認する
1. 原因は`Active Storage`の`variant`だった
1. 現環境では対処できないのと発覚。
1. `variant`をやめて`CSS`での制御に変更し解決。

※ポートフォリオの詳細に関しては[こちら](https://qiita.com/ryo1103/items/973d05c52b2adb3e84b2)に投稿してあります。

## 実行環境
– Ruby ( 2.7.2 )
– Ruby on Rails ( 6.1.4.1 )
– PostgreSQL

## Active Storage と N+1
– 対象になったのはこちら(記事の投稿者を示すユーザーアイコン)
![スクリーンショット 2021-09-16 10.56.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748419/76965a2f-

元記事を表示

イベントclose機能を作ってみた(論理削除)

# やりたいこと
ポートフォリオとしてイベント投稿アプリを作成中イベントの開催日が過ぎたイベントの扱いをどうしようかと調べていたら論理削除の存在を知ったのでイベントを論理削除してイベントを閉鎖する機能を自作した。

# 機能要件
実装の前に今回の機能要件をまとめると、

## ① イベントの期日が過ぎたイベントを論理削除する
具体的には、

– イベントカラムにbooleanを持たせる
– 開催日が過ぎたイベントのbooleanの状態でViewの表示を変更する

## ② 論理削除はイベント期日が過ぎたら自動で実行
具体的には、

– イベント開催日が過ぎたらbooleanを変更するメソッドを定義
– そのメソッドをrakeタスクに登録
– rakeタスクを定期実行する

# 実装
それでは実装開始!

## ① イベントの期日が過ぎたイベントを論理削除する

### イベントカラムにbooleanを持たせる

命名は今回はstatusとしてデフォルトをfalseに設定する

“`ruby:コンソール
$ rails g migration AddStatusToEvents

元記事を表示

【RSpec】結合テストを実施した際に出たchromedriverに関するエラーの解消方法

#対象者

* chromedriverに関するエラーが発生している方
* RSpe結合テストを実施中の方
* JavaScriptのテストが不要な方
* GoogleChromeを使用中の方

#目的

* エラーを解消してRSpecテストを実行できるようにする

#実際の手順と実例
###1.前提

* RSpecテスト実装
* Ruby 2.6.3
* Rails 5.2.5
* Gemfileは下記の通り

““Gemfile.
:
:
group :test do
# Adds support for Capybara system testing and selenium driver
gem ‘capybara’, ‘>= 2.15’
gem ‘selenium-webdriver’
# Easy installation and use of chromedriver to run system tests with Chrome
gem ‘webdrivers’
gem ‘rspec-rails’
gem ‘factory_bot_

元記事を表示

OTHERカテゴリの最新記事