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

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

外部キーreferencesを使ったRailsモデルの関連付け

# references型とは

Ruby on Rails のマイグレーションで使われるデータ型の一つで、
他のモデルへの関連付け(リレーションシップ)を表すために使用されます。

# 使用例
例えば、コメント(Comment)が投稿(Post)に属しているという関係を設定したい場合、以下のようなマイグレーションを生成します。
“`ruby:
rails generate migration Comment Post:references
“`

これにより生成されるマイグレーションファイルには、`post_id`カラムを `posts` テーブルに追加するコードが含まれます。さらに、`post_id` カラムには外部キー制約とインデックスが設定されます。

# 生成後(models) belongs_to
コマンド入力後、models配下のcomment.rbに以下のコードが生成されます。
単数形であることに注意
`belongs_to :モデル名(単数形)`

“`ruby
class Comment < ApplicationRecord belongs_to

元記事を表示

pumaがソケット通信で起動してくれなかった原因

railsのプロジェクトをnginx経由で接続できるようにするにあたって、ソケット通信で起動しようとしてもなぜかbindの設定がうまく機能してくれなかった

gemのソースを辿って原因が見つかったのと、調べている中で同じような問題に直面して質問している人が少しいたのでメモとして残しておく

# 結論
`ENV[‘HOST’]`に値が設定されていると、`rails server`コマンドで起動した際に、`config/puma.rb`で設定したソケットのbind設定は上書きされてしまい機能しなくなる
そのため、`ENV[‘HOST’]`の設定を削除するか、`bundle exec puma`で起動するとソケットのbind設定が機能する

# 概要

“`ruby:puma.rb
socket = Rails.root.join(‘tmp/sockets/puma.sock’)
bind “unix://#{socket}”
“`
nginxとのソケット通信のために、上記の設定を入れていたが、railsのサーバーを起動すると
“`
* Listening on unix:///wor

元記事を表示

RailsとJavaScriptを使った非同期テーブル更新の実装

この記事では、Railsアプリケーションで非同期的にテーブルを更新する方法について説明します。特に、スケジュール管理アプリケーションの例を用いて、特定の日付のスケジュールとその時間枠を動的に表示する方法を解説します。

## 1. 背景

スケジュール管理アプリケーションでは、ユーザーが日付を選択するたびに、該当日のスケジュールと時間枠を動的に表示する必要があります。この実装のためには、RailsサーバーからJSON形式でデータを取得し、フロントエンドでそのデータを使用してテーブルを更新する必要があります。

## 2. 実装の概要

### 2.1 サーバーサイド(Rails)

Railsのコントローラーで、選択された日付のスケジュールと時間枠を計算し、JSON形式で返すアクションを作成します。

### 2.2 クライアントサイド(JavaScript)

JavaScriptで、取得したJSONデータを使用してテーブルを動的に更新します。これには、テーブルのヘッダーとボディの両方を更新する処理が含まれます。

## 3. コードの詳細

### 3.1 Railsコントローラー

元記事を表示

Railsでファイルをアップロードする

## 前提
自分の理解を深めるためのメモです。

## やりたいこと
Railsでファイルをアップロードしたい。

## 実装
### コントローラで受け取る
![スクリーンショット 2024-05-21 午後0.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/5c59f271-6b99-4a22-18b3-fbf9f5c4323d.png)

POSTリクエストで送られるので、subject_dataコントローラのcreateアクションに送られる。
![スクリーンショット 2024-05-21 午後0.18.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/a3abca32-26f1-b70b-8d78-035312a97759.png)

“`ruby:subject_data_controller.rb
class SubjectDataController < Appli

元記事を表示

エンジニア1年目、初の個人開発のサービスをデプロイ成功!

# 初めに

他業種からてエンジニアの転職をして、約1年たったものです。(その前にバイトもしたので、原則的には2年目ですね。)
主にRuby on RailsとPythonを触っています。
今回はついに! 私が個人開発をしたWeb番号札のデプロイをすることができたので、そのお話をしてみたいと思います。

うる覚えですが、ウクライナの戦争で学生エンジニアが避難民のための避難場の情報がわかるサービスを提供したようなニュースを見て、自分のものづくりで人を助けることができるようにしたいと思って、仕事以外でも練習や学習のために色々作ってみようと頑張っています。

でも、最後まで作り切るのができず、1年経った今、やっとデプロイできましたので本当に感激です!

下記が、デプロイしたWEB番号ふだになります。

https://webbangohuda-b2af4450c6c7.herokuapp.com/

Githubコードも公開しています。

https://github.com/worldwidepark/web_bango_huda

## 最初のうまくいかなかったサービス
最初の最初はポー

元記事を表示

【Rails6.1】検索機能をコントローラごとに分岐させたり、検索結果の表示方法を考えた話

# はじめに
Rails6.1の環境で検索画面を作成しました。
検索はなるべく1つのフォームを使いまわしたいけど、ページによって表示を変える必要があったので、その際の設定や初心者ならではの学びについて記録します。

# この記事の結論
* コントローラごとに記述を分けるときは「controller_name」を使った
* モデルのデータと配列のデータは別物
* メソッドにはRailsだけでなくRubyのメソッドもある

## コントローラごとに表示を分ける
今回作成するのは商品予約サイトにおけるショップ側の検索機能です。
予約検索では「予約履歴の検索」
商品検索では「商品情報の検索」
が必要になり、検索の方法が変わってくるので、部分テンプレートを使ってセレクトボタンを分けることにしました。

“`html:app/views/shop/searches/_form.html.erb
<%= form_with url: shop_search_path, method: :get do |f| %>
<% if controller_name == 'items' %>

元記事を表示

Railsのメソッド間で情報を受け渡ししたい

## やりたいこと
メソッド間で認証情報を受け渡ししたい。

`pass_authentication`メソッドで作った認証情報を`convert`メソッドに渡したい。

![スクリーンショット 2024-05-20 午後7.42.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/8391dc37-5226-5828-676a-6fd64ed972fe.png)

## 問題
![スクリーンショット 2024-05-20 午後7.41.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547640/3bcc6e92-da75-b726-2548-e193710425a3.png)
受け渡しができておらず中身がない(nil)と言われる。

![スクリーンショット 2024-05-20 午後8.21.22.png](https://qiita-image-store.s3.ap-northeast-1.a

元記事を表示

Rails – Rspec で現地時間で特定の日付に移動して時間を凍結する

“`rb
it do
travel_to Time.zone.local(2024, 1, 1) do
expect …
end
end
“`

# 参考

Rails: Timecopを使わなくても時間を止められた話

# チャットメンバー募集

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

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

# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura

元記事を表示

Railsアプリケーションでの更新失敗時のロールバックとフィードバック

## はじめに

Railsアプリケーションにおいてユーザーがデータを更新する際、適切なフィードバックを提供することは極めて重要です。この記事では、ユーザーが更新操作を行った後に適切なメッセージを表示するための一般的な方法と、特定の問題に対処するために私が行った具体的な解決策を紹介します。

## 問題点

Railsの `ActiveRecord::Base.transaction` を使用してモデルの更新処理を行っていた際、更新に失敗した場合に `flash[:alert]` を設定しても、そのメッセージが画面に表示されないという問題がありました。特に、トランザクションブロック内で `raise ActiveRecord::Rollback` を呼び出した後の `render :edit` で `flash` メッセージが表示されませんでした。

## 解決策

### コードの修正

まず、以下のようにコントローラのアクションを修正しました。

“`ruby
def update
# パスワード検証を含むカスタム更新処理
self.resource = re

元記事を表示

AIレシピ生成アプリをRails×Next.js×ECSで作ってみた

# はじめに
webアプリケーションを久しぶりに作成したので紹介記事です。
実際に運用して、1000ユーザー獲得を目指します。

# 開発アプリ概要
### アプリ名: FitChef
カロリーや調理時間、使いたい食材、苦手な食材の情報をもとにAIがレシピをその場で生成します。
※塩分量、タンパク質量、食事のジャンル(和食、洋食、中華)、グルテンフリーなどの項目も追加予定

### アプリurl
※Comming Soon

### 使用技術
– Backend
– Rails 7.0.8.1(api mode)
– Ruby 3.2.2
– Nginx
– Puma
– Mysql
– Frontend
– Next.js 14.1.0(app router)
– React 18
– typescript 5
– Infra
– AWS(ECS Fargate/ECR/RDS(mysql)/ALB/Route 53/ACM/VPC)
– Vercel
– Docker
– docker

元記事を表示

binding.pryについて

カリキュラムの中で何度かbinding.pryを使って確認する作業がありましたが、よくわからず・・・
今回アプリ実装の最終課題を進めている中で、ちょっと理解できる部分があったのでテストコードも含めてまとめます。

### deviseを利用したユーザー新規登録のテストコード
#### 入力項目
* ニックネーム
* email
* password
* 名前(名字・名前)
* カナ(名字・名前)
* 生年月日
##### バリデーション
* すべての項目が必須である
* emailは@を含む
* 重複したemailは登録できない
* passwordとpassword_confirmationが一致する
* passwordは6文字以上
* passwordは半角英数字混合
* 名前は全角
* カナは全角カタカナ

##### Ruby on railsのテストコードを書くためのGem Rspecの導入

“`ruby:Gemfile
group :development, :test do
# 中略
gem ‘rspec-rails’, ‘~> 4.0.0’
“`

元記事を表示

あのSQLはActiveRecordを使ってどう書くのか(CASE編)

[達人に学ぶSQL徹底指南書](https://www.shoeisha.co.jp/book/detail/9784798115160)を読んで知見を得つつ、
これRailsのActiveRecordで書こうと思ったらどうなるのかと思ったのでやってみた

# CASE式

## select, group

下記の様に、県から地方単位に人口を集計したいとする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/156655/e06ee409-6ad5-2146-43bc-aedf3c05a20a.png)

これを一発で行うには

“`sql
SELECT
CASE prefecture_name
WHEN ‘徳島’ then ‘四国’
WHEN ‘香川’ then ‘四国’
WHEN ‘愛媛’ then ‘四国’
WHEN ‘高知’ then ‘四国’
WHEN ‘福岡’ then ‘九州’
WHEN ‘佐賀’ then ‘九州’

元記事を表示

RuboCopのExtensions(rubocop-rails)について詳しく調べてみた

# 概要
実務でRuboCopを以下の拡張Copをrequireして使っています。
今回はこの中からrubocop-railsについて、具体的にどんなCopが含まれているのか軽く調べてみました。
– rubocop-rails
– rubocop-rspec
– rubocop-performance
– rubocop-factory_bot

# 参考
RuboCopの拡張Copには、公式でメンテナンスされているものとサードパーティ製のものの2種類があります。
ちなみに上記の4つは全て公式のCopです。

– 公式の拡張Cop
https://docs.rubocop.org/rubocop/extensions.html#official-extensions
– サードパーティ製の拡張Cop
https://docs.rubocop.org/rubocop/extensions.html#third-party-extensions

スレッドセーフとか低レイヤーな部分は自信ない方も多いと思うので、[rubocop-thread_safety](https://gi

元記事を表示

Deviseでのユーザー情報更新時に関連データの誤更新を防ぐ方法

## 背景
RailsのDeviseライブラリを使用している際、Companyユーザーの情報を更新する際に関連データが誤って更新される問題が発生しました。特に、パスワードの検証が失敗しても、その他の関連モデルの変更(今回の場合はaccept_nested_attributes_forで関連付けられた `CompanyBusinessDay` や `CompanyBusinessHours`)が保存されてしまいます。

## 問題の原因
この問題の根本的な原因は、Deviseの更新処理(`update_with_password` メソッド)が単一のトランザクション内で実行されていないため、パスワードの検証に失敗しても他のデータベース変更がコミットされてしまうことにあります。

## 解決策
解決策として、Deviseの `update` アクションをオーバーライドし、全ての更新処理をカスタムトランザクションブロック内で実行します。これにより、すべての変更が正しいパスワードの検証を通過した後にのみコミットされるようになります。

## 実装方法
以下は、カスタムのトランザクションを用いた

元記事を表示

!/bin/bashを記載しているのにentrypint.shでerrorが発生する場合の解決策

# !/bin/bashを記載しているのにentrypint.shでerrorが発生する場合の解決策

## 発生した事象
docker compose runでrails newをする際に、以下のエラーが発生
“`
exec /usr/bin/entrypoint.sh: exec format error
“`

## 原因
いろいろ調べてみて、entrypoint.shに#!/bin/bashを記載すると良いとかplatform: linux/amd64を指定してあげれば良いという記事があった。
どちらもやってみたが、解決はできなかった。

そこで、再度他の方が書いているentrypoint.shの記載と再度見比べてみる。一部違う部分があった。

## 解決策
他の方は一行目に#!/bin/bashが記載してあったが、エラーが発生したentrypoint.shは一行目に別のコメントを#で残していて2行目に#!/bin/bashを記載していた。

これを削除するとエラーが解決した。
“`
# コメント ← 記載していた部分を削除
#!/bin/bash
set -e
“`

元記事を表示

RubyでPHPのvar_dumpライクな機能を提供するGem『ruby_var_dump』をリリースしました

# Gem「ruby_var_dump」を作成&リリースしました
RubyでPHPのvar_dumpライクな機能を提供するGem『ruby_var_dump』をリリースしました

RubyGems.org
https://rubygems.org/gems/ruby_var_dump

Github
https://github.com/hirokiyam/ruby_var_dump

## 特徴
PHPのvar_dump関数に相当する機能をRubyで実現します。
変数の中身を詳細に表示するためのツールです。

## 使い方
Gemfileに以下を追記します。
“`ruby
gem ‘ruby_var_dump’
“`

gemをインストールします。
“`terminal
bundle install
“`

### 使いたいクラスで呼び出す場合

ruby_var_dumpを使いたいクラスに以下を追加して、RubyVarDumpモジュールのメソッドを組み込みます。
“`ruby
require ‘ruby_var_dump’ #ファイルの先頭に追加

include Rub

元記事を表示

【Rails】Boolean 型を入力必須にする

## 概要

`Rails` で `Boolean` 型の値を入力必須にしたいときに `presence: true` を使っても期待通りに動作しませんでした。この記事ではその原因と対処法について説明します。

## 原因

“`rb
validates :column, presence: true
“`

このように記述すると `false` を選択した場合には値が入力されていないと認識されてしまい、バリデーションエラーが発生します。`presence: true` は `false` を無視してしまうため、`Boolean` 型の値には適していません。

## 対処法

“`rb
validates :column, inclusion: { in: [true, false] }
“`

`inclusion` バリデーションを使って `true` か `false` のどちらかの値が含まれているかを確認します。これにより `false` も有効な値として認識されるため、正しくバリデーションが行われます。

## まとめ

`Boolean` 型の値を入力必須にしたい場

元記事を表示

CRUDとは

## CRUDとは
アプリケーション作成時の4つの機能の頭文字を並べたもので
ほとんどのアプリはこの4つの機能で成り立っている

C Create 作成
R Read  表示
U Update 更新
D Delete 削除

## コントローラ記述用コード
“`ruby:controller.rb
# 一覧表示
def index
end

# 詳細表示
def show
end

# 作成
def new
end

# 登録
def create
end

# 編集
def edit
end

# 更新
def update
end

# 削除
def destroy
end
“`

元記事を表示

sidekiq-cron で設定した定期実行処理が schedule ファイルから削除しても停止しない

[sidekiq-cron](https://github.com/sidekiq-cron/sidekiq-cron) で動かしていた定期実行ジョブを停止しようと際に詰まったので備忘録。

## 背景

“`rb:config/initializers/sidekiq.rb
Sidekiq.configure_server do |config|
config.on(:startup) do
schedule_file = “config/schedule.yml”

if File.exist?(schedule_file)
schedule = YAML.load_file(schedule_file)

Sidekiq::Cron::Job.load_from_hash!(schedule, source: “schedule”)
end
end
end
“`
“`yml:config/schedule.yml
test_hello_world:
cron: “*/1 * * * * ” # 1分ごとに実行

元記事を表示

validatesの数値チェックについて

## 環境
Rails5.2
Ruby2.6

## はじめに

Railsの**validates**での数値チェックについて書いてみました。

## 内容
#### その1

validatesで数値チェックをする場合、基本な書き方はつぎのようになります。

“`
validates :hoge, numericality: true
“`

この設定は、Railsガイドによると「整数値または浮動小数点数値にマッチする。符号がある場合もマッチする。」と書かれています。つまり、次の入力はすべてOKになります。

“`
0   # 〇
9   # 〇
+9   # 〇
-9   # 〇
0.999 # 〇
9.999 # 〇
+9.999 # 〇
-9.999 # 〇
“`

数値の入力チェックをこれだけで済ませると、あまりにもざっくりしすぎです。ほとんどの場合において、数値の入力チェックは、もっと、他の条件との組み合わせで行うことになります。

#### その2

整数だけにマッチさせて、浮動小数点数値にはマッチさせたくない場合は、次のようになります。ちなみに

元記事を表示

OTHERカテゴリの最新記事