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

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

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

[Ruby]環境構築(Windows11)

## 1. Ubuntuのインストール
Microsoft Storeにて、「Ubuntu」をダウンロードする。
https://apps.microsoft.com/detail/9pn20msr04dw?hl=ja-JP&gl=US

ダウンロードしたファイルは以下。(2024/05/04時点)
・Ubuntu 22.04.3 LTS Installer.exe

ユーザーとパスワードを設定する。

Ubuntuのパッケージファイルを最新化する。
“`bash:
sudo apt update
sudo apt update -y
“`

作業用フォルダとシンボリックリンクを作成しておく。
“`bash:
mkdir /mnt/c/Code
ln -s /mnt/c/Code ~/Code
“`

## 2. rbenvのインストール
rbenvをインストールする。
“`bash:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
“`

パスを設定する。
“`bash:
echo ‘export PATH=”

Rack::Attackを用いたDoS攻撃防止策の設定方法

# はじめに

この記事では、RailsアプリケーションにおけるDoS攻撃防止策として、`Rack::Attack`の設定方法についてステップバイステップで解説します。`Rack::Attack`は、不正なアクセスや不要なトラフィックを制限するためのミドルウェアであり、アプリケーションを保護する上で非常に有効です。

## ステップ1: Gem の追加

まず、Railsプロジェクトの`Gemfile`に以下の行を追加し、`rack-attack` gemをプロジェクトにインクルードします。

“`ruby
gem ‘rack-attack’
“`

追加後、ターミナルで以下のコマンドを実行して、gemをインストールします。

“`bash
bundle
“`

## ステップ2: 初期化ファイルの設定

`rack-attack`の設定を管理するために、`config/initializers/rack_attack.rb`ファイルを作成します。ファイルには、特定のリクエストを制限するための設定を記述します。以下はその一例です。

“`config/initializers

静的HTMLとRailsにおけるコードの比較

## はじめに
静的サイトにおけるHTMLの記述とRails開発におけるコード記述の違いについて、よく使っているコードより簡潔にまとめました。

備忘録として残しつつ、誰かのお役に立てれば幸いです。

## 前提
– HTMLは静的なサイトを想定(CMSはなし)
– Railsは動的なサイトやアプリを想定
– クォーテーションはシングルに統一
– RailsコードとHTMLコードで同じ内容が出力されるように想定
– データベースについて触れない

## 比較

### ファイル拡張子
#### 静的HTML
“`
index.html
“`
拡張子が“`.html“`のみで、名前も自由に決められる。(“`news.html“`、“`contact.html“`など)
#### Rails
“`
index.html.erb
“`
拡張子が“`.html.erb“`で、ビューフォルダへ作成し、名前は“`CRUD“`アクションより決まる。(“`show.html.erb“`、“`new.html.erb“`など)
– – –
### スタイルシート読み込

RailsエンジニアがGolangでアプリ開発してみた

# 背景
今までRubyとRailsで開発をしていましたが、アプリ開発の解像度をあげるためにGolangでのアプリケーション開発を始めました。
RailsではMVCアーキテクチャにのっとりフロントでerbを使用する開発をしていましたが、Golangではアーキテクチャの設計からフロントエンドとAPI通信するプロダクトの開発も行いました。
この記事ではRubyを書いたことがあり、これからGolang開発の始める人へ、一つの踏み台として受け取ってもらえれば幸いです。

# 目次
1. RubyとGolangの違い
1. 動的言語と静的言語
1. コンパイル型言語とインタプリタ型言語
1. フレームワーク
1. Golangの基本文法
1. ポインタ渡し
1. 多値返却
1. 配列とリスト

# RubyとGolangの違い
### 1. 動的言語と静的言語
> **動的言語**: 実行時に変数の型を決定し、実行時に型チェックを行います。変数の型は実行時に決まるため、柔軟性が高いです。例えば、PythonやRubyは動的言語です。
**静的言語*

Railsで複数の隠しフィールドを正しく送信する方法

Railsでフォームを扱う際には、しばしば複数のデータを同時に送信する必要があります。特に、複数選択可能なデータ(例えば、複数のサービスID)を扱う場合、これを隠しフィールドとして正しく送信する方法が重要です。

## 問題点

`hidden_field` を使用して配列データを送信しようとするとき、単一のフィールドで配列を渡そうとすると問題が生じます。以下のように書いた場合、

“`erb
<%= form.hidden_field :service_ids, multiple: true, value: @services.map(&:id) %>
“`

このコードは期待した通りには動作せず、配列が文字列として解釈され、結果的には `”[“3”, “20”]”`や`”[“3 20”]` のような一つの文字列として送信されてしまいます。

## 解決策

この問題を解決するには、各要素に対して個別の `hidden_field` を出力する方法が最も簡単です。具体的には以下のようにします。

“`erb
<% @services.each do |service| %>

Railsで利用しているsitemap_generatorのテストを書く

Railsで `sitemap_generator` gemを利用してサイトマップを生成しています。
https://github.com/kjvarga/sitemap_generator

そのテストを書く方法を記載します。

# 結論

`SitemapGenerator::Interpreter` を使います。
https://www.rubydoc.info/gems/airblade-sitemap_generator/0.3.5/SitemapGenerator/Interpreter

`SitemapGenerator::Interpreter.run` でXMLファイルを生成します。
それを読み込み、期待するURLが含まれているか検証します。

# 検証用Repo

下記で検証をしていますので、詳細が気になる方はご参照ください。
https://github.com/yuya-yuzen/test-sitemap-generator-spec

# 1. sitemap_generatorを導入する

## 1-1. Gemfileに追加

“`:Gemfile

リファクタリング: ScheduleServiceを導入する(パート2)

## 前回の記事

https://qiita.com/KM9973/items/4fc519bf6dc0ec77957e

## ScheduleService の実装詳細

前回の記事で概要を説明した後、このパートでは `ScheduleService` の具体的なメソッド実装と、コントローラーでの利用方法を深掘りします。

## 1. ScheduleServiceのメソッド実装

`ScheduleService` クラスの中核となるメソッドは、特定の日に提供可能なスタッフのスケジュールを取得し、それを元に利用可能な時間スロットの状況を分析します。

### build_staff_schedule_map メソッド

このメソッドは、指定されたサービスを提供可能なスタッフのスケジュールをマッピングします。スタッフごとにその日のスケジュールを配列として保存します。

“`ruby
def self.build_staff_schedule_map(working_staffs, service, date)
working_staffs.each_with_obj

リファクタリング: ScheduleServiceを導入する(パート1)

## はじめに

この記事シリーズでは、Railsアプリケーション内で複数のコントローラーに分散しているスケジュール関連のロジックを集約し、`ScheduleService` クラスを作成して、コードの重複を解消し、保守性とテストのしやすさを向上させるリファクタリング手法について説明します。最初に、なぜサービスオブジェクトが必要なのか、そして既存のコードとの比較を通じてその利点を見ていきます。

## 問題の特定

例として、予約システムの `ReservationsController` と `SchedulesController` で全く同じようにスタッフのスケジュールを処理している部分があるとします。これらのコントローラーでは、特定の日に利用可能なスタッフのスケジュールを取得し、その時間スロットの利用可能状況を計算しています。

### 既存のコード(抜粋)

“`ruby
# ReservationsController, SchedulesController
def confirm
@company = Company.find(params[:company_id

RailsでのDRY原則: 時間スロット生成ロジックのモジュール化

## はじめに

Railsアプリケーション開発において、DRY(Don’t Repeat Yourself)原則を守ることは非常に重要です。同じコードを繰り返し書くことは保守性や拡張性の低下を招くため、共通の機能はモジュール化して再利用することが望まれます。本記事では、異なるコントローラで使用される「時間スロットの生成」ロジックをモジュールとして抽出し、どのように再利用するかを説明します。

## 問題の定義

例として、スケジュール管理機能を持つアプリケーションを考えます。予約システムやスタッフのスケジュール管理システムでは、特定の日に対する利用可能な時間スロットを生成する必要があります。このロジックが複数のコントローラで必要とされる場合、コードの重複を避けるためにモジュールとして抽出することが理想的です。

## 時間スロット生成ロジックのモジュール化

まず、`TimeSlotGenerator` という名前のモジュールを作成し、共通の時間スロット生成メソッドを定義します。

### モジュールの作成

“`ruby
# app/controllers/concerns/ti

書籍「AWSではじめるインフラ構築入門」 サンプルアプリに関するメモ

## はじめに
[「AWSではじめるインフラ構築入門 第2版」(翔泳社)](https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E6%A7%8B%E7%AF%89%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E5%AE%89%E5%85%A8%E3%81%A7%E5%A0%85%E7%89%A2%E3%81%AA%E6%9C%AC%E7%95%AA%E7%92%B0%E5%A2%83%E3%81%AE%E3%81%A4%E3%81%8F%E3%82%8A%E6%96%B9-%E4%B8%AD%E5%9E%A3-%E5%81%A5%E5%BF%97/dp/4798178004)を購入して、AWSでのインフラ構築を実践的に学習した。
第1章から順に読み進めたが、第13章「サンプルアプリを動かしてみよう」でいくつか問題が発生したので記事にまとめる。
私は、インフラ、AWS、Webアプリ開発の技

ActiveRecord各メソッドの処理速度を計測してみた

### はじめに
RailsでSeedデータを作成していた時に、「**関連テーブルの主キー(id)を全て取得する際に何のメソッドを使うべきか?**」考えたのがきっかけでした。

今回はメソッドの**実行速度**を指標として考えてみました。
⚠︎これが正解というわけではなく、あくまで私個人の見解です。

### 今回使用したメソッド
#### pluck
– **特徴**:指定したカラムのレコードの配列を取得する
– **メリット**: ActiveRecordオブジェクトを生成せず、特定のカラムのみデータベースから取り出すためメモリを節約できる。
– **デメリット**:メソッド実行時に毎回SQLが発行される。

“`ruby
user_ids = User.pluck(:id)
=> [1, 2, 3, 4, 5, …] # 返り値
“`

#### ids
– **特徴**:主キーのカラムデータを全て配列で取得する
– **メリット**:レコードのIDの配列の取得に適している。
– **デメリット**:idの取得のみを行うため、他の属性の

【Rails】deviseでルーティングを作成した際の、いろんなエラーと記述ミス

# はじめに
Deviseを使って管理者機能を取り入れようとモデルを作成した際、ルーティングやフォルダの設定などを変更した後にモデルの名前を変更したくなりました。

変更する際にちょっとしたエラーが発生したり、どこを直せばいいか少し迷った点を記録しておこうと思います。

# 結論
モデルの名前変更の手順としては、以下のコマンドでモデルを削除してから新しく作成し直します。
“`
$ rails d devise 削除したいモデル名
$ rails g devise 追加したいモデル名
“`
このときに、ルーティングの記述もチェックして削除するのがポイントです…!
ルーティングが正しい記述になっていないとエラーが発生してしまうので、今回、私が遭遇したエラーについてご説明します。

## 最初にやったこと…モデルの削除
まずは、結論でお伝えしたコマンドを打ち込んでモデルの削除を行いました。
dはdestroyの意味になります。
“`
$ rails d devise Customer
“`
このとき、Devise用のコントローラやビューも作成していましたが、名前の変更が不要なファイル