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

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

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用のコントローラやビューも作成していましたが、名前の変更が不要なファイル

元記事を表示

form_withについて

form_withについてまとめます。

### form_withとは
Ruby on Railsで入力フォームを簡単に作成することができるヘルパーメソッドである。

### 書き方例
“`ruby:html.erb
<%= form_with (model: @post, local: true) do |f| %>

<%= f.label :title, "タイトル" %>
<%= f.text_field :title %>
<%= f.label :content, "内容" %>
<%= f.text_area :content %>
<%= f.label :image, "画像" %>
<%= f.file_field :image %>
<

元記事を表示

deviseを利用してRailsアプリにLINE連携ログインを導入する

# 初めに
初学者です。

個人開発でRailsアプリにLINE連携ログインを導入した際の記録です。

アプリでLINEBOTと合わせてLINE連携ログインを利用したかったので導入しました。
deviseを使用して実装しています。

この記事で行なっている作業はこちらの記事で構築した環境で実施しています。
https://qiita.com/tkhero555/items/a1811369c59021077d62

アプリ「Puri.log」はこちら(2024/5/3時点でMVPリリース状態)
https://purilog-2a85943c9f18.herokuapp.com/

## 技術構成とバージョン
| カテゴリ | 技術 |
|—|—|
| フロントエンド | javascript/Hotwire/bootstrap |
| バックエンド | ruby3.3.0/rails7.1.3.2 |
| データベース | PostgreSQL16.2 |
| 認証 | devise |
| 環境構築 | Docker / docker-compose |
| CI/CD

元記事を表示

RailsアプリにLINEBOTを導入して応答パターンを作成する。

# 初めに
初学者です。

個人開発でRailsアプリにlinebotを導入した際の記録です。

食事内容と排便の状態を記録することで、自身の胃腸と食事の相性を判定するツールで、ブラウザで行う操作をlinebotから手軽に行えるようにするために導入しました。
この記事ではLINEBotの初期設定から開始し、アプリに必要な応答パターンを作成するところまでを記録しています。

この記事で行なっている作業はこちらの記事で構築した環境で実施しています。
https://qiita.com/tkhero555/items/a1811369c59021077d62

アプリ「Puri.log」はこちら(2024/5/2時点でMVPリリース状態)
https://purilog-2a85943c9f18.herokuapp.com/

## 技術構成とバージョン
| カテゴリ | 技術 |
|—|—|
| フロントエンド | javascript/Hotwire/bootstrap |
| バックエンド | ruby3.3.0/rails7.1.3.2 |
| データベース | Postg

元記事を表示

アプリパスワードが表示されないときの対処法

メール送信機能を実装させようとしたところ、
Googleの設定を変更し、アプリパスワードを取得しないといけないことがわかりました。

手順
①Googleアカウントにログイン
②セキュリティより2段階認証プロセスを有効に変更
③アプリパスワードを発行

この③の手順にてアプリパスワードを発行するためのボタンが消えていました

![スクリーンショット 2024-05-02 15.20.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/cbe0f3f1-b148-74e3-ce85-e6fafa9df8f1.png)

ただ、こちらのURLにアクセスするとアプリパスワードの発行ができ、
さらに該当の作成ボタンが出現しました。
どうやらGoogle側はこの機能をあまり使用してほしくないようです。

URL: https://myaccount.google.com/apppasswords

課題のためには必要かと思いますので、ぜひ試してみてください!

元記事を表示

【個人開発】ローマ字タイピング習得アプリ「しりとり画像ジェネレーター」の紹介(Rails, JavaScript)

# はじめに
はじめまして、Qiita初投稿です。
平([@tairanobuhiko](https://twitter.com/tairanobuhiko))と申します。
業界未経験からWeb業界への転職を目指し、効率的に学習することと高め合えるコミュニティを求めてプログラミングスクール(テックキャンプ)で学習を行なっています。

3月初頭から個人開発のオリジナルアプリを制作しましたので紹介したいと思います。

# アプリの概要
### アプリケーション名
**【しりとり画像ジェネレーター】**

URL

https://word-chain-image-generator.onrender.com/

GitHub

https://github.com/no215tyler/word_chain_image_generator

### アプリの特徴
– 「**ローマ字の学習も、タイピング練習もつまらない!**」という課題をもった小学校低学年層のユーザーが楽しみながら学習できる環境を提供します

# 企画背景

元記事を表示

RailsのRestClientで日本語のクエリが送れない

# はじめに

RailsでAPIを叩く時になぜか日本語のクエリだけがうまくいかなかったのでまとめます

# 問題

検索機能を作成しており、キーワードを使って他のAPIを叩く実装をしていました

“`rb
def get_contract_by_keyword(keyword)
return nil if company_name.blank?

url = UserApi.protocol + “#{UserApi.host}:#{UserApi.port}/v1/contract?keyword=#{keyword}”
p url

begin
res = RestClient.get(url)
data = JSON.parse(res.body)
“`

なぜか英語での検索はいけるのですが、日本語でAPIにリクエストがうまくいっていませんでした

# 解決方法

`RestClient`は以下のようにパラメーターを付与するようでした

“`rb
def get_contract_by_keyword(key

元記事を表示

Rails:dokcer-compose upでバックのコンテナが立ち上がらなくなったMysql2::Error: Failed to open the referenced table ‘users’の解決方法

RailsAPIモードでSAP化したdokcer-compose upで以下のようなエラーが出ました。
“`
backend-1 | Mysql2::Error: Failed to open the referenced table ‘users’
“`
usersのdb:migrateがうまくいかなかったので、srart.shの
“`
bundle exec rails db:create –trace
bundle exec rails db:migrate –trace
“`
の記述をコメントアウトして、そもそもdb接続しなくてもバックのコンテナが立ち上がるように設定しました 。
バックのコンテナが無事起動したところで
“`
docker-compose exec バックエンドの名前 /bin/bash

“`
でバックエンドに入り、
“`
rails db:migrate:status
“`
でステータスを確認
“`
rails db:rollback
“`
でロールバックを行い
“`
rails db:migrate
“`
で詳しい詳細を吐き

元記事を表示

いいね機能非同期化 落とし穴Part2

いいねの非同期化をしようとしたところ、
リロードしないといいねが反映されなくなってしまいました…
お手本通りしているはずなのにどうして!?
とコードを見返していると、気がつきました

“`favorites_controller.rb
class FavoritesController < ApplicationController def create @book = Book.find(params[:book_id]) favorite = current_user.favorites.new(book_id: @book.id) favorite.save end def destroy @book = Book.find(params[:book_id]) favorite = current_user.favorites.find_by(book_id: @book.id) favorite.destroy end end ``` そうなんです。favoriteがインスタンス変数でないのです。 最初い

元記事を表示

Railsでスクレイピングの環境構築してみた【Rails+Selenium+Heroku】

## はじめに
Rails環境かつ、Heorku環境でもスクレイピングをするための環境構築の備忘録。

ローカル環境でとりあえず動かすことはできても、連続してスクレイピングできなかったり、Heorku環境でスクレイピングができない問題がありました。

最終的にHeorku環境で動作させることができたので、参考になれば幸いです。

## やりたいこと

– Heroku環境でSeleniumのスクレイピングが機能するか確認するためのJobを作成すること

今回はwww.google.comにアクセスして、そのページのタイトルを返すものを作ります。
Googleというタイトルをスクレイピングするだけです。
(あくまで動作確認をするだけに徹しています)

## 環境構築
### Docker環境

元々DockerfileでChromeのインストールとChromeDriverをインストールしていたのですが、連続してスクレイピングできなかったり、Heroku環境で動作しなかったのでchromeのdocker imageを使用します。

この他、appやredis, sidekiqは適宜追加

元記事を表示

いいねの非同期化 落とし穴Part1

いいねの非同期化を実装し、課題も提出完了していたものの…
クリックしていない投稿も画面が変わってしまうことが発覚

![スクリーンショット 2024-04-30 15.04.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/98d824c9-0c8d-03f7-7f6a-42cda1174603.png)
![スクリーンショット 2024-04-30 15.04.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/0efb08fc-411d-1ae2-d531-bb9727e6a606.png)

問題だったのはこの箇所↓

“`create.js.erb
$(‘.favorite-btn’).html(“<%= j(render 'favorites/favorite-btn', book: @book) %>“);
“`
createやdeleteを実行したときのjs.erbファ

元記事を表示

Ruby on Railsのyaml.h not found解決方法(Windows11)

# STEP 0
基本的なインストールは、こちらの記事を参考に

https://qiita.com/tks_00/items/711a022c6234fc495724

ただ、新規プロジェクト作成時にyaml.hが無いというような以下のようなエラーが出たので修正
~~~
C:/Ruby32-x64/lib/ruby/site_ruby/3.2.0/bundler/installer/parallel_installer.rb:123:in
`block in worker_pool’
C:/Ruby32-x64/lib/ruby/site_ruby/3.2.0/bundler/worker.rb:62:in `apply_func’
C:/Ruby32-x64/lib/ruby/site_ruby/3.2.0/bundler/worker.rb:57:in `block in
process_queue’
C:/Ruby32-x64/lib/ruby/site_ruby/3.2.0/bundler/worker.rb:54:in `loop’
C:/Ruby32-x64/

元記事を表示

まとめ – Playwright による E2E テスト + VRT差分レポートを活用する

# 前提

– フロント ( Nuxt React など )
– バックエンドAPI ( Rails Node など )

というようなフロントバックエンド構成のWebサービスの話

# E2E テストは何が良いのか?

世の中のテストの種類は

– E2E 的なテスト
– 部品のテスト ( 関数やComponent など )

に大きく分かれると思うが、自分の場合はサービスの最終的な品質保証がしたいので、後者のE2Eテストを重視している

そもそものE2Eテストのメリットだが、何より「ほとんど全てをテストできる」というところが良い。
フロント・バックエンド構成で言えば、その全てを合わせた結合テスト、一連のテストが出来るのだ。

# Playwright で E2E テストをしよう

E2E テストには Playwright というテストフレームワークを使っている

https://playwright.dev/

ヘッドレスでブラウザ操作をしてその結果をテストしたり、画面のスクリーンショットを撮影したり、操作動画を撮影したりできる

たとえば

– URL指定でログインフォームに

元記事を表示

Ruby on Rails: Ransackを用いたモデル検索のエラー解決方法②

この記事では、Ruby on RailsでRansackを使った検索機能の設定方法について説明します。前回の記事では、Ransackの設定と関連するモデルへのホワイトリストの追加を行いました。今回は、フォームから送信されるパラメータに対する処理の方法と、検索結果を正しく絞り込むための対策に焦点を当てます。

## 前回の記事

https://qiita.com/KM9973/items/92ef1698202dc9a89681

## 背景

Railsアプリケーションで、`Reservation`モデルに対して、顧客単位で検索を行う必要がありました。しかし、Ransackの設定やビューからのパラメータ処理に問題が生じ、検索が正常に動作しないという課題がありました。

## エラー内容

フォームから検索を行うために、以下のように設定しました:

“`ruby
<%= search_form_for @r, url: reservations_path, method: :get, local: true, class: 'custom-form-group d-flex' do

元記事を表示

OTHERカテゴリの最新記事