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

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

完全無料でRailsアプリを公開する方法

初めて記事を書きます。
私が最近、Railsでサイト( [BountyHunter](https://bounty-hunter.ml/)という賞金切り口のコンテスト情報集めサイト )を公開しましたので、その構成やら苦労話をつづります。(宣伝も兼ねて)
なお、タイトルにも記載していますが、*無料で*公開することにこだわって作ったため、使い勝手は良いとは言えない点は許していただければと思います。

# なぜ無料にこだわっているのか
そもそも、私がプログラミング経験がないことから端を発しておりまして、Webアプリを作って継続的に育ててみたいと思ったところから、なんとなく身近で開発している人がいたRailsを選択し、まずは[Rails Tutorial](https://railstutorial.jp/)を勉強し始めました。

Rails TutorialではCloud9を開発環境として使うのですが、AWSの最小構成にしていても1年以上経過すると無料枠が使えなくなって有償になります(極少額ですが)。有償になると、クレジットカードに請求が来たりと家庭内でコソコソ勉強している身からすると面倒な

元記事を表示

N+1問題について!

N+1問題とは、、、?

初心者ならではの視点でわかりやすく書いていきたいと思います!

# ①.N+1問題の意味!

N+1問題とは、アソシエーションを利用した場合に限り!!

データベースへのアクセス回数が多くなってしまうと言う問題です!

これはアプリケーションのパフォーマンス低下に繋がります。。。

例えば!通常、コントローラーで  mail.allなどでデータを取得する際は、1度のアクセスで済みます!

しかし例のような、メールが複数存在する一覧画面に、それぞれユーザー名を表示するケースを考えてみます!

この場合、mailsに関連するusersの情報の取得に、メール数と同じ回数のアクセスが必要になってしまいます!

もしも1億メールあれば、1億回以上アクセスすることになり、アプリケーションのパフォーマンスが著しく下がることになるということです!

これを解決するために、includesメソッドを利用します!

# ②.includesメソッドの使用方法!

includesメソッドは、引数で指定された関連モデルを1度のアクセスでまとめて取得してくれます!

記述は、inc

元記事を表示

extend Activesupport::Concernについて

concernsに定義するモジュールでよく書かれているがいまいち何をしているのかよくわかっていなかったので調べました。

### 結論
単純に言えば、`モジュールでのクラスメソッドの定義やそれをincludeする側でクラスメソッドとして追加する方法、クラスレベルでのメソッド呼び出しの容易な方法を提供してくれるもの`だと理解しました。

### 具体例
具体例は以下のページと同じものです。
https://api.rubyonrails.org/v6.1.4/classes/ActiveSupport/Concern.html

例えば、モジュールがincludeされたときに特定の処理を呼び出したり、モジュールのメソッドをクラスメソッドとして追加したい時、通常以下のように書きます。

“`ruby
module M
# https://docs.ruby-lang.org/ja/latest/method/Module/i/included.html
def self.included(mod)
# includeする側(例えばクラス)の特異メソッドとしてClassM

元記事を表示

エラー: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

元記事を表示

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 %>
“`

元記事を表示

エラー: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が悪さをしているらしい

“`ruby:Gemfile
group :development do
(略)
gem ‘spring’
gem ‘spring-commands-rspec’
end
“`

##疑問点
developmentだけのgemなのになぜデプロイ時にエラーが出るのか謎

##解決策
この2つのgemをコメントアウト

“`ruby:Gemfile
group :development do
(略)
# gem ‘spring’
# gem ‘spring-commands-rspec’
end
“`

bundle installも忘れずに!

元記事を表示

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

#はじめに
単体テストコードはフリマアプリ作成時にしっかり書いたのですが、結合テストは書いていなかったのでオリジナルアプリでは書いていきたいと思います。

その中で学習したことをアウトプットとして投稿させて頂きます。

#単体テストと結合テストの違い(単体テストの場合)

単体テストは機能ごとにテストを行います。

例えばuserの単体テストコードの場合

“`ruby:user_rspec.rb
describe ‘ユーザー新規登録’ do
context ‘登録できるとき’ do
it ‘nickname,email,password,company_name,profession_idが存在する場合は登録ができる’ do
end
end
context ‘登録ができないとき’ do
end
end
“`

モデルやコントローラーの機能ごとに問題がないかバリデーションの挙動を確認します。

# 単体テストと結合テストの違い(結合テストの場合)
結合テストの場合はユーザーがアプリを使用する一連の流れを確認するものになります。

ホー

元記事を表示

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] #記録へのコメント

元記事を表示

OTHERカテゴリの最新記事