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

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

【Rails7】ImportmapでGoogleMapApiのloaderを使ってみる

## この投稿は、

DMM WEBCAMP Advent Calendar 2023
シリーズ2 投稿8日目のエントリー(大遅刻穴埋め勢)です。

7日目も私ですが、本記事の元ネタとなります。

https://qiita.com/tomoaki-kimura/items/494f1eb2266f6879dded

## はじめに
DMM WEBCAMP でメンターをやらせていただいております。 @tomoaki-kimura です。
Rails7はフロント周りがとても楽しくなりました。 `Stimulus`もその一つです。丁度よい機能と学習コストです。

JQueryも状況によっては全然アリなのですが、どうやら世の中脱JQueryの流れにはなっているようですし、今後を踏まえてキャッチアップしておくのも手ではないでしょうか。

今回は、既出の記事

https://qiita.com/tomoaki-kimura/items/494f1eb2266f6879dded

こちらの、Rails7版をやっていきます。

## 環境
– Ruby 3.2.2
– Rails 7.1.2

元記事を表示

OpenAPI(Swagger)導入

この記事は [BitStar Advent Calendar 2023](https://qiita.com/advent-calendar/2023/bitstar) の18日目になります。

今回は昨年から開発している [BitStar Match](https://bitstar.tokyo/match/) で導入したOpenAPIについて、RailsでのAPI開発に使える便利なライブラリやツール、またそれに伴う開発手法の選定も含めて紹介していきます。

## OpenAPIとは
OpenAPIは「OpenAPI Specification」の略で、REST APIのインタフェースを定義するためのフォーマットのことです。
以前はSwagger Specificationとして知られていましたが、SwaggerがOpenAPI Initiativeへ寄贈されたことで名称がOpenAPIに変更になったようです。

## Swaggerツールセット
名称がOpenAPIに変わったことでSwaggerという言葉はもう古くなったのかというとそうではなく、現在の「Swagger」はOpenA

元記事を表示

【Rails】permit!メソッドで詰まった話

# はじめに
あるシステムの開発中にBrakemanで「Specify exact keys allowed for mass assignment instead of using permit! which allows any keys」という警告が表示され詰まった時のお話です。

# 問題
Brakemanで警告が表示されたコードは下記です。
~~~
params.permit![:hoges].to_h
~~~
原因を調査したところ、permit!メソッドを使用するとすべてのキーが許可されてしまうことや後から追加したキーも許可されてしまうため、Brakemanは警告を表示してそうでした。

# 解決策
permit!メソッドではなくpermitメソッドで許可するキーを指定するように変更しました。
下記は変更後のコードです。
~~~
params[:hoges].permit(key).to_h
~~~

# おわりに
permit!メソッドはセキュリティリスクを高めるため、可能な限りpermitメソッドを使用した方がよさそうです。誤り等ありましたらご指摘いただけると助かります

元記事を表示

【Ruby】切り上げ、切り捨てメソッドまとめ

## はじめに
Ruby silver認定試験の勉強をしていた際に、小数点系のメソッドで気づきがあったのでまとめてみました。

## round
使う機会が割と多いのではないでしょうか。
挙動は以下の通り。
・自身から最も近い整数のうち最大のものを返す
・最も近い整数が2つある場合は0から遠い方を返す(いわゆる四捨五入ですね)
“`ruby
> 1.9.round
=> 2
> 1.4.round
=> 1
> 1.5.round
=> 2
> -1.4.round
=> -1
> -1.5.round
=> -2
“`
・引数に数値を渡すことで、引数の小数点の位を四捨五入します
“`ruby
> 1.15.round
=> 1
> 1.15.round(1)
=> 1.2
“`
・“`half:“`オプションで最も近い整数が2つある場合の丸め方を指定できます
“`ruby
> 2.5.round(half: :up)
=> 3
> 2.5.round(half: :even)
=> 2
> 2.5.round(half: :down)
=> 2
“`
“`:up“

元記事を表示

LocalでDockerを用いてサーバー間の通信をするときは気をつけよう

## 状況
フロントエンドはNext.js、バックエンドはRailsを用いて開発をしています。
Next.jsのサーバーコンポーネントでバックエンド側にリクエストをする際に、下記のようなエラーが発生しましたので、解決方法について説明したいと思います。

“`
frontend_1 | ⨯ unhandledRejection: TypeError: fetch failed
frontend_1 | at Object.fetch (node:internal/deps/undici/undici:11372:11)
frontend_1 | at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
frontend_1 | cause: Error: connect ECONNREFUSED 127.0.0.1:8080
frontend_1 | at TCPConnectWrap.afterConnect [as oncomplete]

元記事を表示

【Rails】preloadとeager_loadの個人的な使い分け

# 概要
RailsでN+1問題を解決する際によく使われる`preload`と`eager_load`の違いと個人的な使い分け方針をまとめました。

# 背景
先日実務で扱っているアプリケーションにて、メモリ使用率が急上昇しプロセスがダウンしてしまうトラブルがありました。原因は、ActiveRecord関連の処理で**JOINやLEFT_JOINを複数回重ねたSQLが発行**されており、その結果膨大な件数のレコードがRailsに返却され、それらのオブジェクトがメモリ上に展開されてしまったというものでした。

上記の経験から、普段何気なく使っている`preload`や`eager_load`も場合によってはメモリを圧迫しかねないのではと思い、改めてこれらの処理が何をしているのかを理解し利用方針を整理することにしました。

# 詳細
### 仕組みの違い
preload, eager_loadいずれも関連先のレコードをキャッシュしてくれるものですが、その仕組みには以下のような違いがあります。

|| preload | eager_load |
|—-| —- | —- |
|

元記事を表示

現場で使えるRuby on Rails5速習実践ガイドを読んで

# はじめに
今回は[Ruby on Rails5速習実践ガイド](https://www.amazon.co.jp/gp/product/B07JHQ9B5T/ref=ppx_yo_dt_b_d_asin_title_351_o00?ie=UTF8&psc=1)を読んだので、読了したので、良かったところや悪かったところなどをまとめていこうと思います。
購入するか悩んでいる方やこちらの本を気になっている方の参考になれば良いと思います。

# 良かったところ
– railsの基礎を学べるところ。
– 開発の全体像を掴むことができる。
– アプリケーションの作成からCRUD機能を一通り学べること
– Bootstrapを使って見た目も整えたアプリケーションを作ることができる
– Rspecで自動テストについて学ぶことができる
– チーム開発について学ぶことができる
– バージョンアップへの対応を学ぶことができる
– コードのリファクタリングや共通化などのベストプラクティスなどを学ぶことができる

#

元記事を表示

Rails7+Hotwireによるstimulus.jsのフォルダの配下のコントローラの書き方

# はじめに
stimulus.jsのコントローラをフォルダで分けた際のHTML上での記述方法を解説します。
# 問題
JavaScript/controllers/test_controllerは
そのまま
“`html

元記事を表示

タスク管理アプリ ラベルの検索機能の実装

スクールの課題で、タスク管理アプリを作成中、ラベルの検索機能を実装した。初学者の私にとっては複雑な内容だったので、備忘録として残しておく。

まず、前提
## バージョン
– ruby 3.2.2
– Rails 6.1.7.6
————————-
tasksテーブルとlabelsテーブルは多対多の関係。間にconnectionsテーブルという中間テーブルを作成している。
今回のテーマは、ラベルの検索機能。(タスク名のあいまい検索機能とステータス検索機能の部分は既に実装済の状態)
完成した`tasks_controller.rb`は以下。
“`tasks_controller.rb
class TasksController < ApplicationController def index if params[:task].present? if params[:task][:name] && params[:task][:status].present? @tasks = current_u

元記事を表示

RSpecのパラレル実行:効率的なテストのための道

## はじめに
開発の現場では、テストの実行時間がプロジェクトの生産性に直接影響を与えます。特に大規模なプロジェクトでは、テストが肥大化し、時間がかかりがちです。ここ最近は私が普段使っているRSpecというRuby on Railsでよく使われるテストの実行時間を削減するためにも、パラレル実行(並列で実行するテストの方法)の導入の必要性を感じ始めました。
この記事は「テストをパラレル化してみたいよ」という計画についてまとめたものになります。

## パラレル実行の必要性
テストの実行時間を短縮することは、開発サイクルを加速し、より迅速なフィードバックを可能にします。これは、バグの早期発見や機能改善の迅速な実装につながり、結果として生産性が向上します。

## 実現方法の具体化(Myappの例)
例えば`Myapp`アプリというでRSpecのパラレル実行を設定するには、以下の手順に従います:

### Gemの導入
– `Gemfile`に`parallel_tests`を追加します。

“`ruby
gem ‘parallel_tests’
“`

– コマ

元記事を表示

【Rails】Active Model Serializersとjson-api-serializerの比較

# はじめに
RailsでAPIモードを扱う時に、`Active Model Serializers`もしくは`json-api-serializer`を`シリアライザー`の選択肢として用いる事がほとんどかと思います。
今回はこれらの`シリアライザー`について簡単に比較してみました。

# シリアライズとは
`オブジェクト`や`データ構造`を、`ファイル`や`データベース`、`ネットワーク`越しの通信でやり取りできる形式(たいていの場合は文字列)に変換することです。`JSON`や`XML`が挙げられます。

# 比較

| 特徴 | ActiveModel::Serializer | json-api-serializer |
|——|————————|————–|
| 設計 | MVCに沿った構造で、JSON構造を細かくコントロールできる | パフォーマンスに特化しており、シンプルな定義で高速にシリアライズ可能 |
| 使用例 | `render json: user, serializer: UserSerialize

元記事を表示

【Rails】rename_tableでテーブル名を変更したらインデックスのエラーが出る

# 発生した問題

rename_tableでテーブル名を変更する際に、インデックス名が長すぎるというエラーが発生しました。
元々のインデックスは64文字以内になってるし、テーブル名変更するだけなのになんで?と思ったので調べてみました。
“`bash
Index name ‘xxx…’ on table ‘table_name’ is too long; the limit is 64 characters
“`

## 環境
– Rails 7.0.5
– MySQL 8.0

# 原因
rename_tableで、テーブル名の変更とともにインデックス名の変更の処理もされていたためでした。
変更後のインデックス名が64文字を超えていたためエラーが出たようです。

## rename_tableの挙動
rename_tableのコードを見てみます。
“`ruby
def rename_table(table_name, new_name)
schema_cache.clear_data_source_cache!(table_name.to_s)
schema_cac

元記事を表示

[Rails] routes.rbのnamespace, module, scopeの違い

# 目的
現在携わっているRails のプロジェクトのroutes.rbでnamespaceが使用されていたので、その意味、また使用方法が似ているmoduleとscopeとの違いについて備忘録、知識の定着のためにまとめる。

1.namespace
2.scope
3.module

# 1.namespace
namespaceの中にルーティング設定を記述すると
・urlがnamespaceで指定したモジュール名下のpathになる
・controllerファイルがnamespaceで指定したモジュール名のディレクトリ下に配置される
・controllerのクラス名が`namespaceで指定したモジュール名::コントローラ名` になる
### 例)
### routes.rbに記述
“`
Rails.application.routes.draw do
namespace :admin do
resources :users
end
end
“`
#### $rails routes
“`
admin_users GET    /admin/users(

元記事を表示

【Rails】バリデーションのuniqueness: trueについて

# はじめに

お疲れさまです!
おおくまです!

今回は、“Ruby on Rails“のバリデーションの“uniqueness: true“についてです!
基礎的なことなのですが、備忘録として残したいと思います!

# 注意点

:::note warn
内容に誤りがある場合があります!
コメント等で教えていただけると幸甚です!
:::

# 環境

:::note
Ruby 3.2.2
Rails 7.0.6
:::

# バリデーションとは

https://railsguides.jp/active_record_validations.html

“バリデーション“とは、“Ruby on Rails“の“Active Record“に搭載されている**正しいデータだけをデータベースに保存するための機能**です!

一般に利用可能な“ビルトインヘルパー“が用意されており、
– “presnce“:指定された属性が空でないことをバリデーション
– “numericality“:指定された属性に数値のみが使われていることをバリデーション
– “l

元記事を表示

【Rails】外部APIを自社システムに連携するまでの流れを解説

## はじめに
どうもこんにちは、もきお([@mokio_50](https://twitter.com/mokio_50))です。
突然ですが上司から「このAPIうちのシステムで使えるよう実装しておいてもらえる?」と言われたら実装イメージは付きますでしょうか?

もちろんこんな雑なタスクの振り方はされないですが、当時の自分はさっぱりわけワカメ状態でした。なので今回はAPI連携には何が必要でどういうふうに実装したら良いのかを解説していきたいと思います。

あくまで実装の一例程度に見ていただけますと幸いです。

また実際に実装した一連の流れは以下の記事にまとめていますので合わせてご覧いただけますと幸いです。

https://qiita.com/mokio/items/6e65ff8572f303c18750

先日交流会でもLT登壇した際にこの話をしたので忙しければこちらでも!

https://docs.google.com/presentation/d/1ZqJGjvaKSLI-In6XAd_4fvknPLBzdOevkbR_XfJZFfU/edit#slide=id.g12adc

元記事を表示

railsでブロック機能実装してみた

# 概要
ブロック機能を実装しようとしたところ、記事としてまとめられているものがなかったのでアドベントカレンダーの企画に便乗して記事の執筆に挑戦しました!!

初めて記事を書くので拙いコード、文章になってしまっていたらごめんなさい
この記事を参考にしてブロック機能を実装して頂けたらうれしいです
改善点などあればぜひコメントお願いします

## 具体的にできること
ユーザーをブロックした場合そのユーザーから
– マイページを見られない
– フォローされない
– DMが送られてこない
– 投稿一覧、いいねした投稿一覧を見られない

マイページのみにフォローボタン、DMのリンク、投稿一覧、いいねした投稿一覧を置く
➡ブロックされている場合は通常のマイページを見られなくする
➡不審なユーザーからアクセスされないっていう感じです

# 完成図
![Geektwitter12 – Google Chrome 2023-12-10 16-38-32.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3634732/160

元記事を表示

Rails7×Svelte でWebアプリ開発 part2

# はじめに

こちらは [Rails7×Svelte でWebアプリ開発 part1 (環境設定、簡単な表示まで)](https://qiita.com/Satoooon/items/cc6df7679ecd74c2fa11) の続きになります

# Svelte コンポーネントに props を渡す

User model, 詳細画面用の controller, views を作成します

“`
$ bin/rails g model User name:string email:string
$ bin/rails db:migrate
$ bin/rails g controller users show
“`

適当なデータを作成します試しにこちらを使います

“`
irb(main):001> User.find(1)
TRANSACTION (0.0ms) begin transaction
User Load (0.1ms) SELECT “users”.* FROM “users” WHERE “users”.”id” = ? LIMIT ?

元記事を表示

[rails] find_by_sqlで結合先テーブルのカラムを取得する

# はじめに
Active Recordで表現しきれないクエリを記述するときに活躍するfind_by_sqlですが、find_by_sqlを呼び出したモデル以外のテーブルのカラムを取得する際に少し悩んだのでそちらを共有します。

(※実際にfind_by_sqlを使用する場合は複雑なテーブル構造やクエリが想定されますが、今回は簡単のため単縦なテーブル構造とクエリを使用します。)
## テーブル構成

##### usersテーブル
|id|name |age|
|–|——|—|
|1 |taro |20 |
|2 |hanako|22 |

##### postsテーブル
|id|title |user_id|
|–|————-|——-|
|1 |taro’s post |1 |
|2 |hanako’s post|2 |

## 結合先テーブルのカラムを取得する
以下のように結合先のテーブルのカラムも取得するSELEC文を記述し、`Post.find_by_sql`を実行して見ると戻り値はpostテーブル

元記事を表示

計画的なDBスキーマ変更のためのRails Active Recordの実践的知識

この記事は[株式会社エス・エム・エス Advent Calendar 2023](https://qiita.com/advent-calendar/2023/bm-sms)の17日目の記事です。

Railsアプリケーションのライフサイクルにおいて、データベーススキーマの適切な変更は、システムの整合性と拡張性を保つ上で不可欠な要素です。

本記事では、Active Recordがデータベーススキーマ情報をどのように取得し、キャッシュしているのか、そしてこれを利用してRailsアプリケーションがどのように動作するかについて掘り下げます。
それを踏まえて、スキーマ変更の適切なタイミングについて検討して行きます。

※本記事で使用するRailsとDBのバージョンは、`Rails 7.1.2`と`PostgreSQL 15.5`です。

# Active Recordとデータベーススキーマ
### Active Recordを通じて得られるスキーマ情報

Active Recordは、データベーススキーマに関する情報をDBに問い合わせ、取得した情報をキャッシュします。これには、テーブル名、カ

元記事を表示

OTHERカテゴリの最新記事