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

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

タグ選択機能のリファクタリング

# はじめに
rails案件でタグが力業で実装されていたので、そこを改修した際の備忘録となります。
親子孫関係を一括で登録する似たような記事はたくさんあるので、説明は割愛気味で記載しています。

# 実装状況
ruby:3.3.0
ruby on rials:7.1.3
css , js: jsbundling-rails + cssbundling-rails 構成
view:haml

# モデルの構成
以下のような構成
master_tag -> test_tag <- test # モデルの変更 ```ruby class MasterTag < ApplicationRecord has_many :test_tag end ``` ```ruby class TestTag < ApplicationRecord belongs_to :master_tag belongs_to :test end ``` ```ruby class Test < ApplicationRecord has_many :test_tag, dependent: :des

元記事を表示

DeviseTokenAuth×AWS SESでパスワードリセット【Rails】

現在オンラインスクールにてプログラムの勉強をしているとぴ([@topi_log](https://x.com/topi_log))と申します。
DeviseTokenAuthを使ったアプリ開発でパスワードリセットを行ったので、そのまとめとして執筆いたしました。
初学者ゆえ、間違いなどありましたらそっと教えていただけますと幸いです。

# 対象者

– RailsAPIモードで、DeviseTokenAuthによる認証を行っている人
– フロントとバックは別ドメインで管理している人
– AWS SESを使ってパスワードリセットのメールを送りたい人
– 独自メインをCloudflareで作っている人
(Cloudflareでなくても同じように設定すればいけると思います)

# 開発環境

バックエンド
– Ruby on Rails7.1.3 APIモード
– Ruby3.2.3
– DeviseTokenAuth

フロントエンド
– Next.js14
※今回は設定とバックエンドを中心ですので実装内容は細かく書いていません。

インフラ
– Docker
– Vercel(フロントエン

元記事を表示

Rails7系にviteを使ってVue3を入れてみた

## はじめに

Rails7系にはWebpackerが非推奨なのでいままでのようにインストールことができません。そのため備忘録としてRails7にviteを使ってVue3を入れる方法をまとめてみました。

https://github.com/eyamagishi/rails_vue_app

## 実行環境

– Ubuntu:22.04.4 LTS
– Ruby:3.1.2p20
– Rails:7.1.3.4
– Vue:3.4.27

## Railsプロジェクトの新規作成

Railsプロジェクトを作成するために以下のコマンドを実行します。

“`bash
rails new rails_vue_app
cd rails_vue_app
“`

サーバーを起動するため以下コマンドを実行します。

“`bash
rails s
“`

以下の画面が表示されれば次へ進みます。

![スクリーンショット 2024-06-09 121152.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29

元記事を表示

Rails 7.2をちょこっと試す(query and cached ログ編)

# はじめに

rails 7.2beta2 がリリースされたので、ちょっと試してみました。

rails 7.2 では、Rails のログに、実行されたSQLの数が表示されるようになりました。

## ログの確認

Rails 7.1 では、以下のようなログが出力されます。
Rails 7.2 で変るのは、最後の `Completed` の行の `ActiveRecord: 2.2ms` の部分です。

“`sh
Started GET “/books” for 172.25.0.1 at 2024-06-09 08:27:47 +0900
Cannot render console from 172.25.0.1! Allowed networks: 127.0.0.0/127.255.255.255, ::1
ActiveRecord::SchemaMigration Load (0.1ms) SELECT “schema_migrations”.”version” FROM “schema_migrations” ORDER BY “schema_migrations”

元記事を表示

自作WEBアプリのプロモーション(2)

## 自作WEBアプリのプロモーション(2)
皆さんお久しぶりです。
特に大きな変化はないのですが、とある記事を見つけそこで毎日の告知は大事という事で居ても立っても居られなくなり書いているという次第です。

## 何か動きはあったのか
あの記事から2.3日たったのですがユーザー数は増えたのか気になりますよね、

*なんと1人から4人に増えました!!!*

といってもそのうち3人は僕の友人なんですけどね、、、
それでも知らない方が1人来られたというのは嬉しいですね(投稿の内容が「テスト」だったのですがただの視察だった説は否めませんが今は一旦喜びましょう)
以上!!!

## 今回のメイン
おい、ライララこれで今回終わりかよそういう声が聞こえてきそうなのですがそれに対して僕はこういい返しますよ「なわけないじゃないですか」

という事で何を今から言うかというと、僕のサービスOurTimeの説明ですね。

前回の記事の閲覧回数が100回を超えたのになんとびっくり僕どのようなサービスか深く言ってなかったんですよね、
確かにそんなんじゃ皆さん来てくれないなという事で今回僕のサービスがどの様なものな

元記事を表示

Rails のアップデートで、 new_framework_defaults_x_x.rb をコメントインし忘れてないですか?

tldr; Railsのアップデートするとき、`config.load_defaults x.x` に対応した `new_framework_defaults_y_y.rb` に書かれた内容をコメントインして有効にしないと意味ないので注意。

# たとえば Rails 7.0 -> 7.1 にアップデートするとき

“`ruby:config/application.rb
config.load_defaults 7.0
“`

して、7.1の新設定は `new_framework_defaults_7_1.rb` でひとつずつコメントインしていく、というのが[オフィシャルの手順](https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#configure-framework-defaults)だが、このコメントインしていく作業を忘れると、そのrailsは 7.0 のデフォルト設定で動いている。 7.1 の主にBREAKINGな設定は有効になっていない

これを忘れたまま 7.2 にアップデートしようとして `conf

元記事を表示

Railsで.gitignoreにvender/bundleを追記せず、bundle installしたらとんでもないことになった。😱(個人開発で失敗しておきましょう)

# 概要
Railsで個人開発をしていた時です。
***Gemfileをgemを追加した後***、“`bundle install“`したらとんでもないことになりました。😱

# 実際どうなった
下の画像見てくれたらわかります。

![スクリーンショット 2024-06-08 23.42.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1748789/1a0ba823-18cd-5129-f6c2-a4059198d85c.png)

***ファイルの変更数がとんでもないことになりました***。😅
gemを3つくらい追加して、***bundle install***したらこんな風になりました。
これ現場でやったらホラーですよね💦

# 対処法
***vendor/bundleディレクトリ以下のファイルは全てGitによって無視される必要***があります。
“`.gitignore
# Ignore vendor/bundle directory
vendor/bundle/
“`
そして“`

元記事を表示

【Rails】バリデーションエラーが表示されない場合の解決方法

## 概要
Railsで後述するバージョンで「バリデーションエラーメッセージ」が表示されなかったので、解決法とその理由を解説します。

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

### コード
“`ruby:Ruby
status: :unprocessable_entity
“`
**記述する箇所:**
![screenshot_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2711935/395a0180-5353-da37-ff54-af7e963969c9.png)

### status: :unprocessable_entity の役割

ステータスコード422へレンダリングさせるためで`バリデーションエラーの際に返す`コードです。
※ステータスコードとはHTTPレスポンス時の処理結果を3桁の番号で表現すること。

**コードを書かなかった場合:**
Railsはデフォルトでリクエスト成功を返すので、バリデ

元記事を表示

【Rails】Sorcery使用によるGoogle認証の注意点

## はじめに
この記事では、Gem「“`sorcery“`」を使用したGoogle認証に関する注意点をまとめました。具体的な実装方法の解説は行わず、確認すべき重要なポイントについて触れています。

Google認証を導入するなら「“`devise“`」の方が一般的でおすすめですが、既に「“`sorcery“`」を用いてログイン機能を実装している方のために書いています。私自身、sorceryでGoogle認証を実装する際に情報が少なく苦戦したため、同様に苦戦している方々の助けになれば幸いです。

## 環境
– ruby 3.2.3
– rails 7.1.3
– Docker

前提条件としてsoceryによるログイン機能に加えて、Google認証導入までも一通りできている(エラー・不具合込み)とします。

## 確認すべきこと・詰まるポイント
sorceryを使用してGoogle認証を導入する際の確認事項と詰まりやすいポイントについて解説します。

### 承認済みリダイレクトURI
まず、Google Cloudコンソールに登録した承認済みリダイレクトURIと、Ra

元記事を表示

RailsアプリActiveRecordのスロークエリを改善した話

# 背景
私は普段Railsアプリケーションを運用保守しています。
ある日、アプケーションで使用しているAWS RDSのCPU使用率が100%張り付きになってしまう問題が発生しました。
今回はその問題を解決するまでの道筋を記載していけたらと思います。

# 解決までの流れ
解決までの流れはざっくり書くと以下です。
1. AWS RDSのCPU使用率メトリクスを確認し、問題発生時刻を把握
1. AWS CloudWatchで該当時刻のスロークエリログを確認し、問題となるクエリを特定
1. クエリをEXPLAIN
1. 該当のクエリが作られるActiveRecordを特定、EXPLAINした結果を元にコードやDB設定を修正
1. テスト、リリース

# 1. AWS RDSのCPU使用率メトリクスを確認し、問題発生時刻を把握

RDS > データベース > 該当のデータベース > モニタリング > CPU使用率

で確認できます。

# 2. AWS CloudWatchで該当時刻のアプリケーションログやスロークエリログを確認し、問題となるクエリを特定

※スロークエリログをCloudWa

元記事を表示

Sprockets::Rails::Helper::AssetNotPrecompiledErrorの解決

# はじめに
railsアプリケーション作成中にJavaScriptを導入しようとした際に、以下のエラーに遭遇したので、メモとして解説します。

# 問題
![スクリーンショット 2024-06-08 18.40.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3673202/df1efaa1-dcd9-c68f-22a9-4dd3090f8517.png)

Sprockets::Rails::Helper::AssetNotPrecompiledErrorというエラーが表示されました。

# 解決方法
エラーに書いてある通り、以下のコードをapp/assets/config/manifest.jsに追記

“`javascript:app/assets/config/manifest.js
//= link image_preview.js
“`

(image_preview)の部分にはそれぞれ読み込みたいjsのファイル名を記述します。

この追記後、サーバーを再起動したら、エラーが解決

元記事を表示

rails modelとcontollerの作成コマンド

# はじめに
ポートフォリオ作成に入って、コマンドのルールなんだったけ?
と忘れていることが多々あったので、よく使用するコマンドをアウトプットのためにまとめています!
都度追加予定です。

# model作成
基本中の基本model作成です
今回は「Plan」という投稿用モデルを作成していきます

“`
$ rails g model Plan
“`
この g は、generateの略です。生成という意味です

🌱modelの命名規則
英数字の単数形で指定し、先頭は大文字で記述するルールがあります
もし複数の単語を組み合わせる場合は、「PostPlan」などにしましょう

# controller作成
同じく基本のcontroller作成です
先ほどの「Plan」モデルの「plans」のコントローラーを作成します
3パターン記載していきます

#### 通常のcontroller作成

“`
rails g controller plans
“`

#### controller作成 + ルーティング・ビューを同時に作成

“`
rails g controller plan

元記事を表示

Railsプロジェクト作成の際に詰まったことメモ bundle install SSL接続エラー

## この記事の目的
色々な記事を調べましたがどれやってもうまくいかず。
たくさんの方が記事出していたのですぐ解決できると思ったんですが、だいぶハマりました。
私の場合の解決方法を備忘録として。

## 前提
– ruby -v
ruby 3.3.2 (2024-05-30 revision e5a195edf6) [x86_64-linux]

– rails -v
Rails 7.1.3.4

– gem -v
3.5.11

## 確認したこと
bundle installの際のこのエラー
“`
run bundle install
Fetching gem metadata from https://rubygems.org/….

Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/ due to underlying error

元記事を表示

Rails – データベースの既存レコードからバリデーションエラーのデータを探す方法

# 概要

Rails的にはバリデーション違反なのだが、いちどデータベースにレコードが記録されてしまい、そのまま残っているデータがあるという場合がある

それを見つける方法

単に `instance.validate` するだけで良い

## コード例

examines テーブルの全てのレコードのバリデーション違反状態を確認する例

“`rb
Example.all.each do |example|
example.validate

if example.errors.present?
p example.errors.full_messages
end
end
“`

# チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura

元記事を表示

Rails + Enumerize – ActiveRecordで データベースの値が nil が返ってくる

# 問題

たとえばこんなクラスがある時

“`rb
class Example < ApplicationRecord extend Enumerize enumerize :name, in: %i[alice bob carol] end ``` データベースの値が enumerize の定義に対して不正だと ( たとえば `exampmes.name` に `david` という値があると ) 結果に nil が返ってくる ```rb Examinee.find_by(name: 'david').name # nil ``` # 原因 Enumerize の挙動のようだ モデルで enumerize の行を消したら元の値が返ってくるようになった ```rb Examinee.find_by(name: 'david').name # david ``` # チャットメンバー募集 何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。 https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JX

元記事を表示

Rubyで任意時刻のDatetimeインスタンスを作りたい/既存Datetimeインスタンスの値を変えたいときの便利な方法

例えば、2024-06-08 12:00:00を作りたい場合

“`
# 今日は2024-06-08の場合
Time.current.change(hour: 12)

# 今日は2024-06-08ではない場合
Time.zone.parse(‘2024-06-08 12:00:00’)
“`

Rails API公式
https://apidock.com/rails/DateTime/change

元記事を表示

Rails・Rubyでbenchmarkの使い方について

お疲れ様です。

今日は「Rails・Rubyでbenchmarkの使い方について」について部分いたします。

Ruby on RailsとRubyを使用してベンチマークを取るための基本的な方法について説明します。Benchmarkモジュールを使用すると、コードの特定の部分の実行時間を測定することができます。

# 基本的な使い方
RubyのBenchmarkモジュールを使用して、ブロックの実行時間を計測する方法は以下の通りです。

“`ruby
require ‘benchmark’

Benchmark.bm do |x|
x.report(“sleep 1:”) { sleep(1) }
x.report(“sleep 2:”) { sleep(2) }
end
“`

上記のコードでは、sleepメソッドを使って異なる長さの遅延を挿入し、その実行時間を計測しています。出力は次のようになります。

“`
user system total real
sleep 1: 0.000000 0.000000 0.00

元記事を表示

Formオブジェクトの記述方法

丸3日データベースに保存されない状態に悩んだ部分です。
モデル間の関係性、記述方法、メソッドの使い方がややこしかった部分です。
モデルファイルに絞ってまとめます。

購入機能があるアプリで**購入すると配送先情報がorderテーブルへ、購入履歴がpurchaseテーブルへそれぞれ保存される**状態を目指します。

#### 1.model配下にorder_fomr.rbを作成
このファイルにorder.rbとpurchase.rbに記述するべきカラム、バリデーション、保存する処理を記述していく。
“`ruby:order_form.rb
class OrderForm
include ActiveModel::Model
end
“`
新たなクラスを定義し、**include ActiveModel::Model**でform_with や render などのヘルパーメソッドの引数として扱え、バリデーションの機能を使用できるようにする。

#### 2.それぞれのモデルで扱うカラムをすべて記述
“`ruby:order_form.rb
class OrderForm

元記事を表示

Dev ContainerでRuby on Railsの開発環境構築

# 概要
いつもHTMLやJavascriptばかりで
環境構築の必要な作業をやったことがなく
今回Ruby on Railsのチュートリアル用でDockerに
チャレンジしてみました。

# やったこと
## 拡張機能のインストール
本題はrailsの勉強なのでなるべく早く環境構築できるように
VSCodeの拡張機能であるDev Containerをインストール

## フォルダの作成
まずは作業用フォルダ
“`
sample_app
“`
を作成し移動します。
移動後
“`
.devcontainer
“`
フォルダを作成しそこにファイルを置いていきます。

## docker-compose.yml
チュートリアルで開発用のファイルは配布されているのですが
そこも今回は勉強を兼ねて自分で書いてみました。
その際色々調べてみたのですが
チュートリアルをするには過剰かなと思ったので必要そうな
ところだけピックアップしました。

“`docker-compose.yml
version: ‘3’

services:
web:
build:
conte

元記事を表示

謎の挙動をするFactoryBotの作り方

しょーもなく、はたまたネタでもないですが、1時間弱苦しめられたので記す

# 事象

下記コードを実行したときに、`user_id`と`group_id`は同じIDになる想定だったが、なぜか違う値になり混乱していました(変数名は適当なんで気にしないでください)

“`ruby
create(:table_name, user_id: user.id, group_id: user.id, other_group_id: other_group.id)
“`

しかも面白いことに、`group_id: ‘xxx’`と入れてもそれは反映されず、なぜか数値が返ってきます。はて??????

# 調査内容

## コードをデバッグ

とりあえずprintデバッグを進めると、`other_group.id`の値がでていることがわかりました(?)

はて???????

## DDLを調べる

テーブル構造が間違えているのでは?と思い調べましたが大丈夫でした。はて?

## モデルを調べてみる

あーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

元記事を表示

OTHERカテゴリの最新記事