Rails関連のことを調べてみた2022年06月25日

Rails関連のことを調べてみた2022年06月25日
目次

Ruby3/ Rails7/ MySQL8 の構成をdocker-composeで構築する

# はじめに

Dockerコンテナでローカルに環境構築をしたので
作業内容をメモとして残します。

RailsAPIの挙動を確かめるために、構築したものです。

# 構成の概要
* Ruby: 3.1
* Rails: 7.0 (APIモード)
* MySQL: 8.0

# ディレクトリ構成

作業前にディレクト・ファイルを用意しておきます。

“`zsh:ディレクトリ

.
├── Dockerfile
├── Gemfile
├── Gemfile.lock
├── docker-compose.yml
└── entrypoint.sh

“`

# 設定ファイル

各種ファイルの設定していきます。

## docker-compose.yml

まずは複数コンテナを操作するdocker-composeから設定します。

ここではMySQLのパスワードを直書きしていますが
本来は環境変数をまとめる.envなどのファイルを
gitignoreで追跡除外して、GitHub上で
一般に公開されないように考慮するべきです。
(今回は行っていません)

“`yml:doc

元記事を表示

達人プログラマーを読んでみて

# はじめに
– [達人プログラマー](https://www.amazon.co.jp/%E6%96%B0%E8%A3%85%E7%89%88-%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E8%81%B7%E4%BA%BA%E3%81%8B%E3%82%89%E5%90%8D%E5%8C%A0%E3%81%B8%E3%81%AE%E9%81%93-Andrew-Hunt/dp/427421933X)を読んだので気になった箇所の感想を述べながら自分なりの具体例を交えて解説していきます。
– 参考程度に自分のエンジニア歴は1年で Rails, React をメインに web アプリケーション を開発しています。

# 割れた窓は放置しない
– 一回の妥協が後に破綻を生むという話
– Typescript でいえばこう
“`typescript:hoge.ts
hogeMethod(a: any) {
// 何かの処置
}
“`
– 一回でも any で妥協すると無

元記事を表示

表示速度を上げるための個人的な考察 N+1問題編 

N+1問題:データベースからデータを取り出す際に、大量にSQLが発行されて
動作が遅くなってしまう問題のことです。SQLとはデータベースとのやりとりをする際に用いるデータベース型言語(プログラミング言語ではないので注意)です。

実際にN+1問題が発生している様子を見ていきましょう。
N+1問題は1対多のアソシエーションの場合に多くみられるので、投稿一覧ページを見ていきたいと思います。

![ra.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/10021d84-5f2b-1401-9511-606e8a179d40.jpeg)

投稿一覧ページを表示した際のターミナルです。
見てわかる通り、多くのSQL文が発行されています。
いろいろな機能をつけていてSQL文が複雑になっているので簡単な例を用いて説明します。

def index
@posts = Post.all #データベース上から投稿データを取得
end

投稿一覧ページに関するメソッド定義で

元記事を表示

【rails 】他ユーザーが作成したルームに後から参加する、誰がルームを作成したかわかるようにする

テックキャンプ現役受講生がWebアプリを開発するのDay9です。アプリ完成の目標をとりあえず6月末までとしていますので、残り1週間です。終わる気がしません。しかし、嘆いても仕方ないので、明日以降ももやるべきことをコツコツやっていくのみです。さて、今日は他者が作ったルームに、後から他のユーザーが参加する方法について「DB設計、アソシエーション、コントローラーへの記述」の3部分に分けてアウトプットします。

※当方はエンジニア初心者ですので、もっとスマートな方法があるかもしれません。その点ご容赦ください。

# 今回のシチュエーションの設定
登場するテーブルは4つです。Userとroom、User_room、Ownerの4つです。
Userはroomを作成することができ、Roomの中ではチャット等の会話ができる空間を想定しています。
roomを一番はじめに作ったユーザーはOwner(オーナー)として登録し、Ownerにはroomの名前変更等の権限を与えられるものとします。
User_roomはUserとroomの中間テーブルです。下図を見ていただくとイメージが湧きやすいと思います。
# D

元記事を表示

Herokuへのデプロイ時のエラー解決

初めてのHerokuへのデプロイ時にエラーが出てしまったので解決までの流れをメモ。

# エラー内容
“`console
% git push heroku app_name
“`
上記コマンドでアプリをHerokuへデプロイしようとしたところ下記のエラーとなった。
“`console
Enumerating objects: 130, done.
Counting objects: 100% (130/130), done.
Delta compression using up to 8 threads
Compressing objects: 100% (113/113), done.
Writing objects: 100% (130/130), 158.84 KiB | 9.34 MiB/s, done.
Total 130 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Compressing source files… done.
remote: Building source:
remote:
rem

元記事を表示

rspecのテストでエラー

以下のエラー内容が出た。

Failure/Error: raise BrowserNotFound, ‘Failed to find Chrome binary.’

Webdrivers::BrowserNotFound:
Failed to find Chrome binary.

おそらくwin環境下で起こる環境構築エラー。

# 環境
os:win10(WSL2 ubuntu)
言語:ruby

# 解決策
google chromをインストールしただけ
インストール手順は以下を参考
https://astherier.com/blog/2020/08/install-google-chrome-on-wsl2/

元記事を表示

bundle installしたときにUnfortunately, an unexpected error occurred, and Bundler cannot continue.が出た時の対処法

環境
– MacOS Montrey 12.4
– Rails 6.0.5
– Ruby 2.7.6
– Bundler 2.3.16

## エラー内容
“`
$ bundle install
“`

不可解なエラーの発生
“`
— TEMPLATE END —————————————————————-

Unfortunately, an unexpected error occurred, and Bundler cannot continue.

First, try this link to see if there are any existing issue reports for this error:
https://github.com/rubygems/rubygems/search?q=undefined+method+%60full_name%27+for+nil+NilClass&type=Issues

If there aren’t any reports fo

元記事を表示

cannot connect to the docker daemon at unix:///var/run/docker.sock. is the docker daemon running? の解決方法

## 前提
__環境__
 Ruby 2.7系
 Rails 6.1系

## 結論
デスクトップからDockerのアイコンをクリックする等して再起動したら解決しました

## 経緯
1. docker-compose up でサーバーを立ち上げようとする
2. A server is already running. と表示され立ち上がらない
3. 以下コマンドを実行
lsof -wni tcp:3000
4. 実行結果の「COMMAND」に「com.docke」と書いてある行のPIDをコピーして以下コマンドを実行(今思えばこれが誤りかと)
kill -9 xxxxx(コピーした数字)
5. docker-compose up
5. cannot connect to the docker daemon at unix:///var/run/docker.sock. is the docker daemon running?と表示される

## 試したこと
“`
% sudo service docker stop
% sudo service docker start
“`

元記事を表示

RailsのWebpackerがコンパイルしているのにJavaScriptを実行してくれない、ホットリロードが効かない

# はじめに

以前、Dockerを利用したRails+Webpackerの環境を作成したのですが、改めて作成する機会がありやってみたところ、webpackでつまづいてしまったのでその個所をまとめます。

# 問題

## 1. Webpackを設定したがコンパイルが行われない

`/bin/webpack-dev-server`を起動したところ、`public/packs/manifest.json`ができるけれども、`public/packs/js`のディレクトリは作成されなかった。また`/bin/webpack`を実行するとコンパイルが実行されていたが、なぜかJavaScriptは読み込まれておらず、うまくコンパイルが行われていないようだった

以下の記事をみつけた

https://qiita.com/undrthemt/items/52a557cb937d133b7140

`./config/webpacker.yml`のホストが`localhost`になっていたので、docker-compose.ymlのwebpackerコンテナの名前に変更することでJavaScript

元記事を表示

【Rails】他ユーザーの投稿やコメントを削除、他ユーザーの投稿を編集といった操作ができる状態になっていた件

プログラミングを初めて3ヶ月。
備忘録としてつまづいたところを記載し、アウトプットツールとして活用していきます。

ポートフォリオを作成し、学習段階で身につけたスキルだったはずですが
うっかり漏れていてメンターから指摘を受けたので再発防止、備忘録の為、記載します。

# 他ユーザーの投稿やコメントを削除、他ユーザーの投稿を編集といった操作ができる状態になっていた。
編集ページのurlを直接打ち込んだり、削除リンクを検証ツールから書き換えることで可能なので注意しなくてはならない。
編集や削除といった操作を実装する場合、ログインユーザーのデータなのかチェックを挟む必要がある。

# 直打ち禁止のコード

直打ち禁止対象のcontrollerを開き
(今回は、posts_controller.rb)

“`ruby:posts_controller.rb
class PostsController < ApplicationController before_action :authenticate_customer!, except: [:show, :index] before

元記事を表示

テスト投稿

#見出し1
##見出し2

-test

testtest

#Tab

class test

def hoge
test.method
end

#Space

class test2

def test2
test2.method2
end

元記事を表示

中間テーブルへのデータの保存の仕方

今日は現役テックキャンプ生のアプリ開発Day8分を記述します。今回は中間テーブルへのデータの保存の仕方について記述します。まず、中間テーブルの説明から始めます。

# 中間テーブルとは?
テーブル間で多対多のアソシエーションが発生する時、間に交通整理員を置くようなイメージで中間テーブルというものを作成します。中間テーブルに関しては下のメチャクチャわかりやす記事を参考にしてください

https://qiita.com/Lotuswhite/items/0794b468ecc627e01ae1

# 今回のDB設計
今回は私自身のアプリ開発で利用しているUserとRoom(userが参加する場所)のテーブルを例に説明します。2つのテーブルのアソシエーションを確認します。
・userは複数のroomに参加できるので、userは複数のroomを持っていると言えます。
・roomには複数のuserが参加しているので、roomは複数のuserを持っていると言えます。
以上より、userとroomは多対多のアソシエーションなので、中間テーブルとしてuser_roomを作成します。

# マイグレー

元記事を表示

【個人開発】ITエンジニアの経歴書

# 作ったもの

ITエンジニアの経歴書を作成するWebツールを作りました。
登録お待ちしております。
まだ、テスト中でバグだらけですが、たくさんの方にお使いいただけると嬉しいです。

こちら -> [KEIREKI(仮名)](https://keireki-it-engineer.com)

## 経歴書の作成例
経歴書の作成例リンクは [こちらから](https://keireki-it-engineer.com/users/test_user)

– スクショ
![経歴書スクショ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/91978/83f24455-20a2-1816-dd5d-dc7adfbfd85e.png)

# 作った経緯

今月で勤めている会社を退職することになり、次の職場を探すにあたりスキルシートを書いていたんですが中々良いフォーマットがなくて困ってました。
それなら、ついでに作ってしまおう! ということで作ってしまいました。

# 使った技術

## フロントエンド
– 言語

元記事を表示

【Rails】javascriptで入力フォーム(textarea)の高さを自動で変えたいよ

# はじめに
textareaの高さが固定の場合、改行していくと前の文章が埋もれていってしまい、かなりUXが悪い。
これを改善するために、Javascriptを導入し、改行に合わせて高さが自動で変わるようにしていく。
意外と一連の流れを記載している記事が少なかったため、かなり殴り書きだが投稿する。ただし、自身が実施した流れのため環境によって要不要がある。
使用環境は以下の通りである。
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
| 3 | turbolinks| 5.2.0 |
| 3 | webpacker | 4.0.7 |

**変更前(右のスクロールバーが出る)**
![gif2.gif](https://qiita-image

元記事を表示

経験ゼロの新人が1ヶ月でウェブアプリを作らされるヤバい研修 part 3

Part 1はこちら↓

https://qiita.com/Terao-Takumi/items/d2b02a4cf0470675107e

# 前回のあらすじ

DB設計から2週間で、実装したい機能がすべてできてしまった。手動テストもできていたので、結構時間が余るな…何しよっか…というところで、、、

# リファクタすっか!

新人2人が書いたコードは、動きはするものの見るに耐えないものだった…。書いた本人たちはそこそこ書けたつもりだったけれど、先輩に指摘をもらってようやく何がだめなのかが理解できた。今見返すと恥ずかしくて⌘Qを連打したくなるレベル。

例えば、、、

### ・いろんなところで全く同じコードが複数回出てきている

「気持ち悪いな…これ絶対まとめた方がいいだろうなぁ」と思っていた箇所に案の定指摘をもらった。エンジニア的に言うと「冗長なコード」というらしい。メンテナンス性が下がってしまうのが一番のデメリットだけれど、個人的にはそもそも”美しくない”と思っていた。

### ・変数名が意味不明

part 2のコードでも書いたような、「a」とか「b」とか読ませる気のない

元記事を表示

Railsのレスポンスに任意のHTTPヘッダを追加するRackミドルウェア

“`ruby:config/initializers/additional_http_headers.rb
class AdditionalHTTPHeaders
def initialize(app)
@app = app
end

def call(env)
status, headers, body = @app.call(env)
additional_headers.each{|k, v| headers[k] = v }
[status, headers, body]
end

private
def additional_headers
{
‘x-foo’ => ‘bar’,
}
end
end

Rails.application.config.middleware.insert_before(
ActionDispatch::Cookies, AdditionalHTTPHeaders
)

“`

元記事を表示

Railsのrakeタスク

# 定義されているタスクの確認
“`
% bundle exec rake -T
“`

# rakeタスクの作成
## ファイルの作成
“`
% rails g task :namespace :task_name
“`
lin/tasks/task_name.rbが作成される。
## 作成されたファイル
“`ruby:task_name.rb
namespace :namespace do
desc “TODO”
task task_name: :environment do
end
end
“`
## 実行したい処理を記述
“`ruby:task_name.rb
namespace :task_name do
desc ‘あいさつをする’
task task_name: :environment do
puts ‘おはようございます’
end
end
“`
`desc`には処理内容の説明を記載する。
`:environment`はRailsで準備されているenvironmentタスクを先に実行している。

# rakeタスクの実行
“`
% bu

元記事を表示

Rails関連で記事にするほどじゃないけど、まとめておきたいものを列挙する感じの記事です

# マイグレーションファイル

マイグレーションファイルは、データベースを生成する際の設計図になるものです。

また、マイグレーションファイルを実行することで、記述した内容に基づいたデータテーブルが生成されます。

# リレーショナルデータベース 【relational database】 RDB / 関係データベース

リレーショナルデータベースとは、データベースの構造の一つで、一件のデータを複数の属性の値の組として表現し、組を列挙することでデ

ータを格納していく方式。属性を列、組を行とする表(テーブル)の形で示されることが多い。最も普及している方式で、単にデータベースとい

った場合はリレーショナルデータベースであることが多い。

元記事を表示

Railsでの一覧機能作成手順

# はじめに
初心者なりにまとめたものになりますので、諸先輩方からは何書いてんだおめえと感じる部分があると思います。
そう感じた際は、お手数ですが、コメント頂けると幸いです。

内容としては、 ***コントローラー作成からマイグレーション***になります。

## 目次
– ***一覧機能を実装する手順***
-routes.rbファイルの編集
-ルーティングの確認
-コントローラーの作成
-indexアクションの定義
-ビューファイル作成・編集
-ビューの実装確認
-モデルの作成
-マイグレーションファイルの編集
-マイグレーションの実行

## routes.rbファイルの編集
– ***app/config/routes.rbに存在するファイルの編集***
初期は
Rails —— do
~~
end
が存在し、~~の箇所へ下記のコードを入力
※作成したばかりの時は、~~の中身は削除する
#
get ‘posts’, to: ‘posts#index’
HTTPメソッド ‘URIパターン’, to: ‘コントローラー名#アクション名’

***解説*

元記事を表示

レコード数が膨大のカラムにダウンタイムなしでindexを貼る方法

## はじめに
MySQLで、レコード数が膨大のカラムに index を貼ろうとすると、デプロイ時に落ちることがありました。
この記事では、実際に行ったダウンタイムなしで index 貼る方法を紹介します。

### 簡単なDB構成
今回は、User テーブルの point カラムに対して index を貼ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/833332/a5096689-3568-7e43-e4fa-c4f9da3778a1.png)

## 手順
– index を貼った point_new カラムを追加し、deploy
– point の値を point_new に移すスクリプトを流す
– rename する migration ファイルを作成し、deploy

### index を貼った point_new カラムを追加
User テーブルに、point_new というカラムを追加します。
カラムの追加に関しては、[こちらの記事](https://qiita

元記事を表示

OTHERカテゴリの最新記事