Rails関連のことを調べてみた

Rails関連のことを調べてみた

Railsチュートリアル第11章学習まとめ

## 第11章アカウントの有効化
アカウント登録の時にメール認証を用いて行う機能を作成する。

1.ユーザーの初期状態は「有効化されていない」(unactivated)にしておく。
2.ユーザー登録が行われたときに、有効化トークンと、それに対応する有効化ダイジェストを生成する。
3.有効化ダイジェストはデータベースに保存しておき、有効化トークンはメールアドレスと一緒に、ユーザーに送信する有効化用メールのリンクに仕込んでおく
4.ユーザーがメールのリンクをクリックしたら、アプリケーションはメールアドレスをキーにしてユーザーを探し、データベース内に保存しておいた有効化ダイジェストと比較することでトークンを認証する。
5.ユーザーを認証できたら、ユーザーのステータスを「有効化されていない」から「有効化済み」(activated)に変更する。

## 11.1AccountActivationsリソース
AccountActivationsリソースを作るために、まずはAccountActivationsコントローラを生成
`$ rails generate controller Accoun

元記事を表示

Railsテスト環境でのSQLクエリログの表示方法

### ステップ1: 設定ファイルの開き方
まず、Railsプロジェクト内の`config/environment/test.rb`ファイルを開きます。このファイルには、テスト環境の設定が含まれています。

### ステップ2: 設定の変更
ファイル内で、以下のコードスニペットを追加します。

“`ruby
config.logger = ActiveSupport::Logger.new(STDOUT)
config.log_level = :debug
“`

このコードは、ログを標準出力(コンソール)に書き出すようにロガーを設定します。

### ステップ3: ファイルの保存
変更を加えた`test.rb`ファイルを保存します。

### 結果
以上のスニペットを設定ファイルに追加することで、テスト環境でテストを実行する際にSQLクエリログがコンソール出力に表示されるようになります。これにより、テストプロセス中に実行されるSQLクエリを監視し、分析することができます。

元記事を表示

【Rails】RSpec便利なカスタマイズ

# カスタマイズ一覧
“`spec_helper.rb
RSpec.configure do |config|
# 1
config.filter_run_when_matching :focus

# 2
config.example_status_persistence_file_path = “spec/examples.txt”

# 3
config.disable_monkey_patching!

# 4
if config.files_to_run.one?
config.default_formatter = “doc”
end

# 5
config.profile_examples = 10

# 6
config.order = :random

# 7
Kernel.srand config.seed
end
“`

## 1. 特定のテストのみ実行する方法
### 方法1
“`terminal
// rspec ファイルパス:行数
$ rspec spec/models/user_sp

元記事を表示

dockerfileのダイエット

# はじめに
他社案件で、docker環境を構築されてましたが、イメージ容量が大きかったので、ダイエットした際の備忘録となります

# 前提
ruby:3.3.0
rails:7.1.3
css , js: jsbundling-rails + cssbundling-rails 構成

# 作業内容
## 初期状態
“`docker
FROM ruby:3.3.0

# 必要パッケージ
RUN apt-get update \
  && apt-get install -y curl

# install node
RUN curl -fsSL https://deb.nodesource.com/setup_21.x | bash – \
  && apt-get install -y nodejs \
  && apt-get install -y ffmpeg \
  && apt-get install -y tzdata

# install yarn
RUN npm install –global yarn

ENV TZ Asia/Tokyo

# コンテナの作業デ

元記事を表示

【Rails】RailsでBootstrap5系を取り入れる際はCDNが楽だった

# はじめに
Rails6.1の環境に、yarnでBootstrap5を導入してみようと思いましたが、なぜか反映されませんでした。
Bootstrap4.6を導入した際は上手くいったのでおかしいな…と思いつつ、調べるとどうやら5系はjQueryではなくJavaScriptを利用するそう。

仕組みが違うからなのか…?と困ってしまった際の私が行った解決方法をご紹介します。

# 結論
Bootstrap5はyarnを使って導入しようとすると、rails-ujsとの兼ね合いが悪くなってCompileでエラーが発生します。
それと同時にrails-ujsも機能しなくなってしまいます。

わたし自身がCompileについての理解が浅いので詳しく説明はできませんが、そもそもの仕組みが違うようです。
さらに、Bootstrap5系をyarnを使って「app/javascript/packs/application.js」などに設定する方法だと、Compileに関わる他の部分の設定も修正が必要になり、ちょっと作業が大変になってしまうとか…。

具体的な解決方法としては、単純にCDNを使えば良いとのこ

元記事を表示

Next.js14+Rails7.1 APIモードをDockerで構築する手順

## 概要
フロントエンドにReact,Next.js、バックエンドにRuby on Rails(apiモード)を使用したアプリをDokerを用いて構築する際に、Rails7.1での変更が影響し構築時に時間を取られたので、備忘録を兼ねて構築手順を記載します。

以下のような方に役立つ手順となっていれば幸いです。
– Dockerを使用してRails7.1(apimモード)のアプリを構築したい方
– Dockerを使用してフロント(React,Next.js)とバックエンド(Rails)を分けてアプリ構築したい方

## 環境
アプリ構築時の環境は以下の通りです。執筆時点で可能な限り最新バージョンを使用するようにしました。
– Ruby: 3.3.1
– Rails: ~> 7.1.0
– mysql: 8.0
– node.js: 20.12.12

## 全体の流れ
以下の項目に沿って手順を記載します。
1. ディレクトリ構成とファイルの準備
1. フロントエンド側の環境構築
1. バックエンド側の環境構築

## 1.ディレクトリ構成とファイルの準備
以下のディレクトリ構成になるよ

元記事を表示

find / find_by / where / find_or_create_by 各メソッドの違い

find、find_byとfind_by!、where、find_or_create_byとfind_or_create_by!など
たくさん出てきてややこしかったためまとめました。

# findメソッド
__説明__
・主キー(id)を指定しデータベースから1件のレコードを取得
・存在しない場合エラーを返す
・複数のデータ取得が可能

__使い方__
モデル.find(主キー)

__例__
“`
Book.find(1)
“`
“`
Book.find(params[:id])
“`

# find_byメソッド
__説明__
・条件を指定しデータベースから最初に見つかった1件のレコードを取得
・存在しない場合はnillを返す
・主キー以外のカラム検索も可能(カラムを指定しないとエラーになる)
・複数のデータ取得不可

__使い方__
モデル.find_by(任意のカラム名: 格納されている値)
失敗したら例外発生
モデル.find_by!(任意のカラム名: 格納されている値)

__例__
“`
Book.find_by(title: “ruby”)
“`
“`

元記事を表示

RailsアプリケーションにBulletを導入してN+1問題を発見する

## はじめに

RailsのN+1クエリ問題は、データベースのパフォーマンスを大きく低下させる原因となります。この問題を解決するために、`bullet` ジェムを導入し、効率的に問題を特定し、解決する方法を紹介します。

## BulletGemの導入

1. **Gemfileに追加**

開発環境でのみ`bullet`を使用するように設定します。

“`ruby
group :development do
gem ‘bullet’
end
“`

2. **インストール**

変更を加えたら、コマンドラインで以下を実行して、gemをインストールします。

“`bash
bundle
“`

### Bulletの設定

`config/environments/development.rb`にBulletの設定を追加します。

“`ruby
config.after_initialize do
Bullet.enable = true # Bulletを有効にする

元記事を表示

railsでjsonを返すAPIエンドポイントを返す方法とpostmanでの確認

## 対象読者

元記事を表示

railsでのお作法について纏めてみた

## 対象読者
– railsを初めて触る人
– 簡単なCRUD、ルーティングまでを一つの記事で理解したい方
– apiとwebのエンドポイントを共存させるほう法を知りたい方

元記事を表示

RailsアプリケーションにおけるDateパースの重要性

Railsの開発では、日付の扱いが意外とトリッキーな場面に遭遇することがあります。今回は、私が開発中の予約システムで直面した一つの問題と、その解決策について共有したいと思います。

## 背景

予約システムでは、様々なサービスに対して顧客が予約できるようにするため、日付を元に利用可能な時間帯やサービスの空き状況を確認する機能が必要です。特に、日付をパラメータとして受け取り、それを基にスケジュールを計算する必要がありました。

## 問題の発生

以下の`for_customer_index`メソッドでは、`@service_availability`の値が正常に取得できていましたが、`new`メソッドでは`@service_availability`が期待した値を返さないという問題が発生しました。

“`ruby
def for_customer_index

@date = Date.parse(params[:date]) # この行が重要

end
“`

“`ruby
def new
@date = params[:date]

元記事を表示

ancestry gemで発生するN+1問題の解決法

# はじめに
Railsで階層構造を持つデータモデルを扱う際に使用する`ancestry` gem。便利なメソッドが準備されている反面、そのまま使用してしまうとN+1を起こしパフォーマンス的に良くない状態になってしまったので、どうやって解決したかを説明します。

## TL;DR
`ancestry` gemを使用して親子関係を扱う際に、メソッドを使わず自己参照のリレーションを利用することでN+1問題を解消できます。

# 環境
Ruby 3.3.0
Rails 7.1.3.2
ancestry 4.3.3

## 親子関係とN+1問題の例
`ancestry` gemを使うと、カテゴリーのような階層構造を持つモデルを簡単に作成できます。例えば、以下のようにCategoryモデル単体で階層化されたモデルを例に考えます。

“`ruby
# category.rb
class Category < ApplicationRecord has_ancestry end ``` N+1を起こす原因箇所 ```erb -# index.html.erb

Railsチュートリアル第10章まとめ

## 10章
edit、update、index、destroyアクションを加え、RESTアクションを完成させる
ユーザーが自分のプロフィールを自分で更新できるようにし
ユーザーを削除し、データベースから完全に消去する機能も追加していく

## 10章 10.1ユーザーを更新する
ユーザー情報を編集するパターンは、新規ユーザーの作成と極めて似通っている。
newアクションと同じようにeditアクションを追加していく。

POSTリクエストに応答するcreateの代わりに、PATCHリクエストに応答するupdateアクションを作成。

## 10.1.1編集フォーム
Userコントローラーにeditアクションを追加しビューを追加していく。
前提としてユーザー情報を読み込む必要がある。

“`app/controllers/users_controller.rb
class UsersController < ApplicationController def show @user = User.find(params[:id]) end def new

【個人開発】VTuberの発見と布教が出来るWebアプリを作りました

# はじめに
初めてのWebアプリケーション開発をしてみました。
名前は`にゅーぶい!`です。

https://newvtuber.com/

どのようなものか書きます。

# どのようなアプリか
### 簡単な紹介
ファンは自分がまだ知らないVTuberの発見と布教、VTuberはファンの獲得が出来ることを目指したサービスです。

### 想い
VTuberという文化が生まれてから久しく、現在では数えきれないほどVTuberがいます。
そのため、自分のタイプや好みに合うまだ知らないVTuberがきっと多くいます。
そこで、VTuberのプロフィール閲覧/作成を行えるサービスがあれば、より楽しい推し活に繋がると思い、本アプリの開発をしました。

# 使い方
### 文字のみ
一部ユーザー登録の必要なものがありますが、登録やログイン等の記述は割愛します。
最低限の使い方は下記の2つです。
① 一覧から気になるVTuberを押す
② プロフィールを見る
上記に加えて、下記の使い方もすると少し豊かになります。
・ ご自身の好きなVTuberのプロフィールが無い場合は作成する

[Rails]タスク管理アプリ(Part.1)

## はじめに

Railsでタスク管理アプリを作成します。
利用する各ツールのバージョンは以下とします。
|ツール|バージョン|
|-|-|
|Ruby|3.2.4|
|Ruby on Rails|7.1.3.2|
|PostgreSQL|16.2|

## アプリケーションのひな型を作成する

アプリケーションのひな型を作成します。
実行には少し時間がかかります。
“`bash:
rails new taskapp -d postgresql
“`

実行が完了したらアプリケーションフォルダに移動します。
“`bash:
cd taskapp
“`

データベースを作成します。
“`bash:
bin/rails db:create
“`
2つのデータベースが作成されました。
>$ bin/rails db:create
Created database ‘taskapp_development’
Created database ‘taskapp_test’

サーバを起動します。
“`bash:
bin/rails s
“`

以下にアクセスします。

htt

【Rails】モデルが特定のメソッドを呼び出せるか検証する方法

`respond_to?()`を使用すると引数に指定したメソッドが呼び出せるか検証できます。
呼び出せれば`true`を呼び出せなければ`false`を返却します。

“`rb
モデル.respond_to?(メソッド名, include_private=false)
“`

Userモデルがname属性を呼び出せるか検証するには以下のように記述します。

“`rb
user.respond_to?(:name)
“`

プライベートメソッドを呼び出せるか検証するには以下のようにします。

“`rb
user.respond_to?(:private_name, true)
“`

【Rails】データベースに反映済みのマイグレーションファイルの修正方法

マイグレーションファイルを作成して, rails db:migrate し, あとからカラム名のタイポに気づきました

“`db/migrate/20240502121245_create_checkouts.rb
class CreateCheckouts < ActiveRecord::Migration[7.0] def change create_table :checkouts do |t| t.string :fisrt_name # first_name としたかった t.timestamps end end end ``` rails db:migrate していない場合は, そのままマイグレーションファイルを編集すればよいですが, すでにしている場合はデータベースに反映されているため, ロールバックをする必要があります。 反映されているかは rails db:migrate:status で確認できます。up になっていれば反映済み, down になっていれば未反映です。 今回は以下のように up

【未経験】AIであなたもアーティスト!個展生成サービスを作成しました【Next.js / Rails API / Three.js】

# はじめに
こんにちは!
ガク(@Necono_Engineer)と申します。
未経験からエンジニア転職を目指して、日々学習をしています。

この度、( **[Gallery.ai](https://ai-coten-nu.vercel.app/) )** を開発しました。

# サービス名 : **[Gallery.ai](https://ai-coten-nu.vercel.app/)**

![GOGP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3364974/a05ab668-5f14-3afa-3971-3d6a1a9009f8.png)

▼ サービスURL

https://ai-coten-nu.vercel.app/

▼ Githubリポジトリ

https://github.com/gadname/AI_coten

# サービス概要
`AIイラスト生成機能`を搭載したオンラインギャラリーサービスです。

例えば、

rails + mysql8 + kaminariの時にpaginationでtimeoutする

## 起きる問題
mysql8.0.23以降で、select count(*) が、パラレルスキャンによりもの凄い時間がかかるようになってしまうため、kaminariのpaginationで表示がpumaなどがtimeoutしてしまう。

そもそもの問題の詳細はこちら

https://zenn.dev/hmatsu47/articles/mysql80-count-slowdown

## 原因の調査
kaminariではページ数をしらべるために、上記のクエリーを発行しています。
これはkaminariのAR拡張で実装されています。

“`ruby:kaminari-activerecord/lib/kaminari/activerecord/active_record_relation_methods.rb

def total_count(column_name = :all, _options = nil) #:nodoc:
return @total_count if defined?(@total_count) && @total_count

[Rails]ユーザー管理機能

### 1. ユーザーに関するscaffoldを自動生成する。
“`bash:
bin/rails generate scaffold user name:string address:string age:integer
“`
>$ bin/rails generate scaffold user name:string address:string age:integer
invoke active_record
create db/migrate/20240504174055_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
invoke resource_route
route resources :users
invoke