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

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

手軽にできる!RailsとNext.jsでURL上のIDを暗号化する方法

## はじめに
Rails APIとNext.jsで開発しているときにURL上でIDを平文のまま載せたくない場合の対策になります。

## 実現させたいこと
具体的には、Rails APIをバックエンドに、Next.jsをフロントエンドとして利用し、
ユーザーがブラウザ上でproduct/1などといったIDを直接露出する形ではなく、暗号化したIDを使ったURL(例: product/暗号化されたID)を用いて、データへのアクセスを行います。
“`mermaid
sequenceDiagram
participant Frontend as Next.js
participant Backend as Rails API

Frontend ->>+ Backend: 暗号化したIDでデータにアクセス要求
Backend ->>+ Backend: 暗号化したIDを復号化し、該当するデータをデータベースから検索
Backend ->>+ Frontend: 応答として必要なデータを返送
“`

## やること
### Rails API側
やることとしては共通

元記事を表示

Railsの日本語化

## バージョン
Ruby:3.1.4p223
Rails :7.0.8.1

## 手順
1. 複数言語に対応させるため”rails-i18n”というGemを導入
2. “ja.yml”ファイルを作成
3. application.rb内に設定を記述

### 1.複数言語に対応させるため”rails-i18n”というGemを導入
rails-i18n は、Railsアプリケーションで国際化(i18n)をサポートするためのGemで。
国際化とは、アプリケーションのテキストやメッセージを複数の言語に対応させるためのプロセスのことで、このGemを使うことで、Railsアプリケーションで多言語サポートを実装するための便利な機能が提供されます。

“`ruby
gem ‘rails-i18n’
“`

### 2. “ja.yml”ファイルを作成
**config➡locals➡配下に”ja.yml”を作成**

“.yml”はYAML(YAML Ain’t Markup Language)形式のファイル拡張子。

“ja.yml”ファイル

元記事を表示

ECS(Rails)×S3で画像取得できなくてつまづいた話

## はじめに
本番環境のECS(Rails)×S3で詰まったエラーの共有ができればと思います。

## 実現したいこと
ECSにデプロイされたRailsアプリケーションからS3に画像をアップロードし、それを取得する機能を実装しようとしていました。
システム構成は以下のようなイメージです。

## 発生した事象とエラー
S3への画像アップロードは問題なくできましたが、画像の取得ができないという問題が発生しました。ECSのログを調査した結果、以下のエラーが確認できました。
“`bash
ArgumentError (Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only

元記事を表示

【概要まとめ】ActiveRecordの基礎

※解釈が入り混じっているので不備などがあるかもしれません。予めご了承ください。
※ザックリと理解するというスタンスなのでまとめ方が不十分かもしれません
***
引用元・参考サイト
[Railsガイド](https://railsguides.jp/active_record_basics.html)
***
# 概要
– `Active Record`はMVCのMを相当する『オブジェクト指向 × DB操作』を可能にした仕組み
データ操作をオブジェクトを介して実現可能にしている
– ORMというシステム設計パターンを採用しており、ORMではDBの種類ごとのSQLの記述の違いを吸収してくれるなど”互換性が高い”のが大きな特徴
– `Active Record`は次のような特徴を持つ
– 先述したSQLでのDB操作をオブジェクトを介して実行可能な点に加えて、『RDBのような”テーブル同士の相関”などよりDB寄りなデータの意味までもオブジェクトで表現できる』
> ・モデルおよびモデル内のデータを表現する[^1]
> ・モデル同士の関連付け(アソシエーション)を表現する[^1]

元記事を表示

Railsで時間割を投稿する

# 時間割の投稿を作成します
この記事では、時間割を作成するときのやり方を説明しています。
時間割以外でも、表形式で投稿したいときに使えます。

完成イメージ![時間割.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3657847/048f5200-d181-0436-715a-57e9e8ad77ec.png)

## 前提
1.resourceでルーティングがされている
2.コントローラーを作成済み
## 手順
1.モデルを作成
2.投稿画面の作成
3.一覧ページの作成
4.デザインを変更する

## 1.モデルを作成
時間割以外に使いたいカラムを入れて作成します。(時間割に使うカラムも入れてもいいのですが、長くなりすぎて面倒なので後ほど追加します。)

この記事の場合は、titleカラムとcontentカラムの入ったPostモデルを作成しています。
“`ruby:ターミナル
rails g model Post title:string content:text
“`
次に、今作成したマイグ

元記事を表示

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