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

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

Railsアプリケーションにおける外部キー制約エラーの解決法

## エラーの概要
Railsアプリケーション開発中、以下のような外部キー制約違反のエラーに直面しました。

“`
ActiveRecord::InvalidForeignKey (PG::ForeignKeyViolation: ERROR: update or delete on table “company_business_days” violates foreign key constraint “fk_rails_… on table “company_business_hours”)
“`

このエラーは、`Company`モデルを削除しようとした際に発生しました。

## エラーの解消方法
問題の解決には、データベースの外部キー制約に`on_delete: :cascade`オプションを追加する必要があります。これにより、親モデルの削除時に関連する子モデルが自動的に削除されます。

前提条件のセクションを、提供されたモデルの定義に基づいて再構成します。ここで目指すのは、記事の読者が問題の文脈をより明確に理解できるように、モデル間の関係性とそれらがどのように連携

元記事を表示

new_framework_defaults_x_xを更新しても、値が反映されないことがあるので注意

Railsのアップデートの際に、新しいバージョンの config のデフォルト値を少しずつ反映させるときに `new_framework_defaults_x_x` を使うと思います。

今回、`config.load_defaults 6.1` へ上げる前に、`Rails.application.config.active_record.has_many_inversing = true`の設定をしても反映されないことがありました。

:::note
たまたま今回は has_many_inversing でハマりましたが、他の設定でも同様ですし、new_framework_defaults 以外の `config/initializers/*` での設定も同様に`Rails.application.config.xxx`の設定が反映されない可能性があるので記事にしてみました。
:::

## 結論

初期化時の読み込み順によっては、`config/initializers/*` のファイルの設定値が反映されないことがあるので、 その場合は`config/application.rb`

元記事を表示

【Rails】CDNを利用してBulmaを導入する

## はじめに
**自己紹介**
 未経験からWEB系エンジニアへの転職を目指している者です。現在はRuby on Railsを学習中です。

**この記事を書いたきっかけ**
 フロントエンドとバックエンドは分けずに手軽にビューを作成したいと思い、CSSフレームワークのBummaを導入したので学習記録として記事を書きました。

## 動作環境
– mac OS Sonoma 14.2.1
– ruby 3.2.2
– rails 7.0.7

## Bulmaの導入方法を調べてみた
Bulmaの導入方法を調べたところ、以下の方法がありました。
– 公式サイトからダウンロードする
– npmなどのパッケージマネージャー使う
– CDNを利用する
– bulma-railsというgemを使う

今回は特にこだわりもなかったので、一番簡単に使えそうなCDNを利用する方法を選ぶことにしました。
以下のリンクはBulma公式サイトのスタートガイドです。

https://bulma.io/documentation/overview/start/#bulma-start

## CDNって何?

元記事を表示

RailsにおけるRate Limitの実装ガイド

# Rate Limitの概要
Rate Limitは、APIへのリクエスト数を制御するためのシステムです。
これは、APIを過剰に使用したり、悪意のある攻撃を防ぐために使用されます。
Rate Limitによって、一定期間内に許可されるリクエストの数が限定されることで、サーバーの過負荷を防ぎ、サービス品質を維持することができます。

## Rate Limitの利点
### サービスの過負荷防止
APIへの過剰なリクエストがサーバーのリソースを圧迫し、サービスが遅くなったり、最悪の場合はダウンしたりすることを防ぎます。
Rate Limitによって、予期せぬトラフィックの急増による障害からAPIを守ります。

### 悪意のある利用の防止
DDoS攻撃など、悪意のあるユーザーによる過剰なリクエストを防ぎます。
これにより、APIが安全に運用されることを確保します。

### 公平なリソースの利用
全てのユーザーに対して公平にAPIリソースへのアクセスを提供します。
一部のユーザーによる過剰なリクエストが他のユーザーの利用機会を奪うことを防ぎます。

### コスト管理
クラウドサービ

元記事を表示

request テストで rpsec テスト用のパラメータを作成

# attributes_for
attributes_for を用いることで、モデルに紐づくパラメータを簡単に作れる

“`rb
let(:valid_params) { attributes_for(:agent_scout_company) }
let(:valid_params) do
{
name: “株式会社ホゲ”,
name_kana: “カブシキガイシャホゲ”,
zipcode: “1057510”,
address: “東京都港区 東京”,
tel: “0312345670”,
url: “https://www.hoge.co.jp”,
license_number: “11-ユ-343453”
}
end

“`

元記事を表示

未経験エンジニアがRailsチュートリアル難しくてう〇こ漏らした話

# 脱糞注意 苦手な方はブラウザバック推奨

## 前書き
こんにちは。りょりょです。
本日は、題名の通りRailsチュートリアルが難しすぎて漏らしたのでその感想をつらつらと書いていこうと思います。
これから、Railsチュートリアルを受講しようとしている方にはぜひ参考にしてもらいたいです。

## 自己紹介
・新卒アプリケーションエンジニア(Ruby,Rails)
・未経験(大学では遺伝子の研究)

## 現在のレベル
・Progate受講済み(html&css Ruby Rails 各4周)
・基本情報技術者試験合格済

## 受講のきっかけ
私はもともと業務でRailsを使っている手前、Railsチュートリアルを使って自主学習をしようと思っていました。しかし、教育係の先輩からまだ少し早いんじゃないかというストップをかけられていたわけです。(入社2ヶ月目くらいの話です。)
そして、基本情報技術者試験の勉強やProgateでの勉強を終えて、万全の気持ちでRailsチュートリアルに臨んだわけです。
ちなみに、Macを使ったローカル環境で受講しました。

## 受講の感想
受講された方な

元記事を表示

【個人開発】ラーメン待ち時間シェアアプリ「ちゃくどん」を作ってみました【Rails, Hotwire, AWS, Docker, GitHubActions】

## はじめに

「[ちゃくどん](https://tyakudon.com)」というWebアプリをリリースしましたので紹介させてください!
私は非エンジニアで子供が3人いることもあり、制作期間10ヶ月とコツコツ開発してきました。制作アプリの解説に加えて、開発・運用していく過程においての学びや、失敗談についてもシェアできたらと思います。

## ちゃくどんとは?

ざっくり説明すると、ラーメン店に並びはじめる「接続」から、ラーメンが提供される「着丼」までの待ち時間である「ちゃくどんレコード」を共有するアプリです。

|ちゃくどんレコードの計測・登録|ちゃくどんレコードの閲覧|
|:-:|:-:|
|![measure.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754248/e6027e72-7c8a-5a88-594b-ad38306e4497.gif)|![レコード閲覧.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.co

元記事を表示

routesの`:id`の部分をid以外にしたい備忘録

`resources :furnitures`とした時に生成されるURLは↓こんな感じになると思います。
| | |
|:-:|:-:|
| furnitures#index | GET /furnitures |
| furnitures#create | POST /furnitures |
| furnitures#new | GET /furnitures/:id/edit |
|furnitures#edit | GET /furnitures/:id |
| furnitures#show | GET /furnitures/:id |
|furnitures#update|PUT /furnitures/:id|
|furnitures#destroy|DELETE /furnitures/:id|

show画面だと`/furnitures/1`とかになると思うのですが、この数字(:id)を変えて、`/furnitures/sofa` `/furnitures/table`という感じにしたい。
[公式ドキュメント](h

元記事を表示

パスワードをハッシュ化するgem

gemとは、RubyやRailsでプログラミングをする際に「よく使う機能」をパッケージ化したもの。
「検索機能を作るgem」や「ハッシュ化するgem」など様々なgemが存在し、Railsにインストールすることで使用することができる。
今回はbcryptという「ハッシュ化するgem」を使います。

Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。

「gem’gemの名前’,’gemのバージョン’」とすることで記述したバージョンのgemをインストールすることができる。

Gemfileにgem’bcrypt’を記述する。
ターミナルでbundle installコマンドを実行する。
記述したgemをインストールできる。

bcryptをインストールすると、has_secure_passwordメソッドが使用可能になる。
パスワードを扱うUserモデルにhas_secure_passwordを追加する。
class User < ApplicationRecord has_secure_password . . . end ユーザーを保存す

元記事を表示

image_tagを使って画像遅延読み込み

## image_tagとは?
画像ファイルのリンクを作成できる。

https://railsdoc.com/page/image_tag

# 画像遅延読み込みとは?
jsなどのライブラリを用いて画像を非同期読み込みすること。
遅延読み込み用のjsは検索すれば出てくると思うのでダウンロードしておいてください。
ここでは遅延読み込みについて詳しくは触れないので各自調べていただければと思います。

Lazy Loadで画像を遅延ロードする方法

# 画像遅延読み込みをimage_tagを使って実装する
第一引数に画像ファイルへのパスを指定し、第二引数以降にオプションやHTML属性を指定できる。
第一引数に遅延読み込み用のファイルパスを指定し、第二引数のdate-srcで実際の読み込む画像のファイルパスを記載する。
“`rb
<=% "遅延読み込み用の画像ファイルパス","date-src"=>“表示させたい画像のファイルパス”,altなど… %>
“`
第二引数にはハッシュの形でファイルパスを渡してあげてください。

元記事を表示

非同期リクエスト時の`AbstractController::ActionNotFound`エラーについて

## エラーの背景

あるRailsプロジェクトで、ユーザーがチェックボックスをクリックすると、選択された曜日に応じてビジネス時間を動的に更新する機能を実装しようとしました。この非同期通信のために、JavaScriptの`fetch` APIを使用して`/companies/update_business_hours`エンドポイントに対してPOSTリクエストを送信しました。しかし、リクエストを送信した際に次のエラーが発生しました。

“`
AbstractController::ActionNotFound at /companies/update_business_hours
======================================================================
The action ‘update_business_hours’ could not be found for CompaniesController
“`

## エラーの原因
‘update_business_hours’メソッドを’public’ではなく、’

元記事を表示

【Rails】No route matchesが起きた不思議な理由

Railsでプロフィール画面を作成、実装したのだが、エラーが起きた。
いじっているうちにエラーの出方が姿を変え、最終的に「えっここ?」というところを直したら解決したので記録しておく。

### プロフィールへのリンクをクリックしても「boardコントローラでprofileのidが見つからない」とエラーが出た。
え、プロフィールの画面へのリンクだからprofileコントローラかuserコントローラしか関係ないし、idを表示させない方法でルーティングを組んでいるので、profile_pathのidがboardコントローラでマッチしないというエラーは、なぜなんだろう・・。と理由が分かりませんでした。

ビューファイルの周辺をいじったりすると逆におかしくなり別のエラーが出たりして直していると、今度は別のエラーが出ました。

### 「No route matches」
「profile_path」は使えない、というエラーが出ましたが、ルーティングの設定はされており、ターミナルで確認しても使えるはず。
またしてもビューファイルの今度は関係なさそうなリンクを直したりしているとまた別のエラーが出てし

元記事を表示

Railsで動的に営業時間入力フォームを表示させる方法(ストロングパラメータに注意!)

Railsアプリケーションにおいて、`テーブルA(hospitals)`と`テーブルB(business_days)`間の関係を管理するために`テーブルAB(hospital_business_days)`中間テーブルを設定し、さらにそれに`テーブルC(hospital_business_hours)`を1対多で関連付ける場合、複雑なフォームの扱いが必要になることがあります。本記事では、このような構成を`accepts_nested_attributes_for`を用いて実装し、チェックボックスで選択された曜日に応じて営業時間の入力フォームを動的に表示する方法を解説します。

📌 重要な参考資料 📌

▶️ 以下の記事も参考にしてください。 ◀️
[Railsアプリケーションにおける外部キー制約エラーの解決法](https://qiita.com/mathematics9973/items/39db3300770ccb71600d)

## 実装の概要

実装の核となるのは、次の4つの部分です。
※実際に私が使用した記述を引用しているのでテーブル名等は各自必要なものに読み替えてく

元記事を表示

Railsフォームで`fields_for`を使用せずにネストされた属性を扱う方法

# Railsフォームで`fields_for`を使用せずにネストされた属性を扱う方法

Railsの`fields_for`メソッドは、フォーム内でネストされた属性を簡単に扱うための便利なヘルパーです。しかし、特定の状況や要件により`fields_for`を使えない場合があります。この記事では、`fields_for`を使用せずにネストされた属性をフォームで扱う方法を紹介します。

## 前提条件
`hospitalsテーブル`、`business_daysテーブル`、`hospital_business_daysテーブル`、`hospital_business_hoursテーブル`がある。
`hospitalsテーブル`と`business_daysテーブル`は`hospital_business_daysテーブル`を中間テーブルとして多対多。`hospital_business_daysテーブル`と`hospital_business_hoursテーブル`は1対多の関係である。

## 基本的な考え方

`fields_for`を使用せずにネストされた属性を扱う主な方法は、フォー

元記事を表示

【個人開発】断捨離アプリ「steteco」を未経験者が開発しました(Rails7)

## はじめに
初めまして。この度、初めて断捨離アプリである個人アプリ「steteco」をリリースいたしました。
まだまだプログラミング学習中の未経験エンジニアであり、技術的な内容などは誤りを含む可能性があります。
そのため、おかしな記述などがあればコメント等で教えていただけたら幸いです!
## stetecoについて
今回のアプリは、不用品の整理をしている際に「もったいないから」「フリマアプリで売れるかもしれないから」と考えてしまい、捨てる決断ができない優柔不断な方向けの、断捨離を後押しするサービスです。

私は、部屋の整理をして不用品が出るたびに、「フリマアプリで売れるかも」と思い、結局物置部屋のものが増えるだけという悪循環を繰り返していました。
同様に優柔不断な性格で整理ができない人が多いと気づき、断捨離を後押ししてくれるツールがあれば便利なのではと考え、「steteco」を作成しました。
– 作成期間: 約3ヶ月
– URL:https://steteco-dansyari.com/
– GitHub:https://github.com/ayaikg/sort_unwante

元記事を表示

【GraphQL Ruby】値が空文字の場合に null が返るように

# 結論

“`ruby
class NilIfEmpty < GraphQL::Schema::FieldExtension def after_resolve(value:, **_rest) value.presence end end ``` ```ruby class Types::BaseField < GraphQL::Schema::Field def initialize(*args, **kwargs, &block) super # NOTE: unwrap を使うと、String! のような null: false のフィールドでも if の中を通せる if type.unwrap == GraphQL::Types::String extension(NilIfEmpty) end end end ``` # 背景など Rails × GraphQL Ruby で GraphQL サーバーを実装していて、非必須な String 型のデータのためにDBレベルでカラムに空文字のデフォル

元記事を表示

【Rails】ジャンル検索機能(ECサイト)

今回はECサイトのジャンル検索機能の実装を解説します!
完成形はこちらです。

![スクリーンショット 2024-02-19 222738.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3677302/04d3071b-72e3-bd1b-ac8e-469f6b2a37d6.png)

## 環境
AWS Cloud9
Ruby on Rail 6系
Bootstrap Ver.4
kaminari導入済み
itemコントローラー作成済み
モデルのアソシエーション記入済み(ItemモデルとGenreモデル)

## 方法
### コントローラー作成・記述
“`terminal
$ rails g controller genres show
“`
今回はshowページのみ作るので、この時点で作成しておきます。
次にコントローラーに記述を加えていきます。
“`ruby:genres_controller.rb
class GenresController < ApplicationControlle

元記事を表示

authorizeメソッドについて

## authorizeメソッドとは

authorizeメソッドとは、`Pundit`というgemを導入することにより、Rubyで使用できるメソッドのこと。

### 役割
引数のオブジェクトの認可を確認するメソッドとして、よく使用される。

例えば、下記の`authorize(current_site)`の場合、
authorizeメソッドの引数である`(current_site)`が、認可されているかどうかを確認するメソッドとして、`authorize`メソッドが使用されている。

(`current_site`サイトにログインしているユーザーがadminかそれ以外かの認可の確認を行っている。)

#### authorizeメソッドの呼び出し元であるコントローラー
“`Ruby:app/controllers/admin/site/attachments_controller.rb
class Admin::Site::AttachmentsController < ApplicationController def destroy authorize(curre

元記事を表示

【Rails】画像投稿機能を実装する

Gem carrierwave(Webアプリケーションにファイルアップロード機能を提供するGem)を使用する。

## アップローダーとは
・アップローダーとはクラスオブジェクトである。
・アップローダーから生成されたオブジェクトを使って、ファイル名やファイルの保存先を取得できる。
・アップローダーにはファイルアップロードに関する設定を書ける

## 実装の流れ
1. アップローダーを作成
2. アップローダーをモデルで使用するように宣言
3. アップロードの設定を各ファイルで行う

## 達成したいこと
▪️掲示板に画像を設定できること
▪️サムネイルと表示されたラベルをクリックすると、ファイル選択画面が表示されること
▪️掲示板入力フォームで画像のみが未入力で作成ボタンを押した場合でも、掲示板一覧画面にリダイレクトして「掲示板を作成しました」というフラッシュメッセージが表示されること
▪️carrierwaveで使うカラムはBoardモデルにboard_image という名前で追加
▪️画像ファイルを登録する際に
→・画像は必須項目に含めない
  ・アップロードできるファイルは

元記事を表示

Macで以前できなかった Ruby+Rails環境構築に再トライ

## 以前できなかったこと
### 1.  rbenvを利用してのruby version up
Ruby Version UpしたのにVersionが変わってない!
“`
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin23]
“`

この時は諦めてrbenvをアンインストールしてHomebrewからインストールしなおしました。universalと表示されているのは一度アンインストールしたのでMacデフォルトのRubyバージョンが表示されています。

### 2.  rbenvを使用してのrails install

Railsインストールしたのになんで???
“`
$ rails -v
Rails is not currently installed on this system. To get the latest version, simply type:

$ sudo gem install rails

You can then rerun your

元記事を表示

OTHERカテゴリの最新記事