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

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

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

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

元記事を表示

【Rails6.1】AIチャットと一緒に在庫を減らす処理を考えた話

# はじめに
Railsの学習中に、予約時に在庫を減らす作業が分からなかったので、調べたりAIに聞いたりしながら完成させた記述について記録します。

# 結論
在庫を減らす処理には、「decrement!」というレコードの値を減らすことのできるメソッドを使用しました。
“`ruby:
item = Item.find_by(params[:pre_order][:item_id])
@pre_order.amount = params[:pre_order][:amount] #予約数:amountをフォームから受け取る
item.decrement!(:stock, @pre_order.amount) #decrement!でitemの在庫:stockを減らす
“`

# 記述修正の流れ
最初、自分で調べたり考えてみたりしてみたのですが、どうにも上手くいかなかったのでAIチャットに聞いてみることにしました。

## AIへの質問
「railsにおいて予約機能を作成中です。
@​pre_orderがsaveできたらitemレコードのstockカラムの数を1個減らす処理

元記事を表示

Rails ルーティング namespace / module の使い方

# はじめに
わからなかったことを教えてもらったので、
アウトプットに投稿します!

初っ端から躓いたルーティング…
namespace / module はどう使い分けるのか😕
まとめていきます!

# ルーティングの特徴
### 何も指定しない場合(通常のルーティング)

“`routes.rb
get ‘home/about’ => ‘homes#top’
“`

通常のルーティング
Prefix Verb URI Pattern Controller#Action
home_about GET /home/about(.:format) homes#about

“`r

元記事を表示

【Rails】Ruby on Rails 5 速習実践ガイド感想

# はじめに
Railsを勉強中。
Ruby on Rails5 速習実践ガイドを読んだので勉強したことなどのまとめ。

:::note warn
Railsの最新バージョンは記事執筆時点で7.1となっているため、参考にされる方はバージョン差異による挙動の違いなどにお気をつけください。
:::

# 学んだこと
– リダイレクトする際の`flash[:notice]`のようなメッセージなどの渡し方は、`flash[:alert]`も用意されている
– レンダーで渡したい際には`lash.now[:alert]`なども使える
– flash.keepなども使える
– コールバック:処理の前後に任意の処理をよばせる
– オリジナルの検証処理の書き方、`validate`と`validates`は違うので気をつける
– マイグレーションでバージョン上げ下げを指定できる
– データの絞り込み条件
– scopeの活用:繰り返しの絞り込み条件を読みやすく記述できる `scope :名前 -> { 指定条件(条件の値)}`
– 重複を避けるためにフィルタを使う
– Rspec(自動テスト)について

元記事を表示

【Ruby on Rails】Rails理念に沿ったビューの共通化

共通させるビューのファイル名には、アンダースコア[ _ ]から記述化させるのがルールです。
“`:ファイル名:例
_common.html.rb
“`

# ■方法
1. 共通するコードを[ _ ]ファイルに記述
2. コピー元のコードを削除
3. 共通化させたいファイルに以下のコード記述
“`ruby:共通させるビューのファイル
<%= render partial: 'アンダースコアを取り除いたファイル名' %>
“`
※アンダースコアは書かないルール

元記事を表示

【Ruby on Rails】destroyアクションに実装させるturbo_methodとturbo_confirm

### ■ 使用される場面
destroyアクションを使いデータを削除する場面。

### ■ 参考コード
“` Ruby
<%= link_to("削除", "/users/index", data: {turbo_method: 'delete', turbo_confirm: '本当に削除してよろしいですか?'}) %>
“`

### ■ 重要度
★★★

### ■ 効果
**`turbo_method: ‘delete’`**
Turbolinksを使用してHTTP DELETEリクエストを送信するための指示。
通常のHTMLリンクでは送ることは出来ないが,TurbolinksはJavaScriptを介してこの機能を実現できる。

**`turbo_confirm: ‘本当に削除してよろしいですか?’`**
削除リンクをクリックした際、ユーザーが確認できるためのメッセージ。
誤操作防止。

### ■ その他
この機能は、通常はJavaScriptで実装されますが、Railsでは`link_to`ヘルパーを使用することで、JavaScriptで書くことなく実装でき

元記事を表示

rack-attack だと十分でなく、Web アプリケーションファイアウォール(WAF)を使う理由

> Cloudflare に出来て rack-attack に出来ないことって何でしょうか。これについて何かご存じですか? また、rack-attack を Cloudflare の WAF と同じように動作させるよう改良できる可能性はあるのでしょうか? -Sammy

とても良い質問ですね。「分散型サービス妨害(Distributed Denial of Service:DDoS)」とは何かを理解し、リトルの法則をほんの少し用いて考えると、この質問にかなりうまく答えられるのではないかと思います。

まず、DDoS の本質を理解しましょう。DDoS とは、簡単に言えば、アプリに対する分散された多数の IP アドレスからの大量のトラフィックです。この「大量のトラフィック」という点が、サイトをダウンさせる要因です。膨大な量のリクエストに圧倒されると、インフラストラクチャの何かが壊れ(通常はデータベース、または単に十分な Web サーバーの容量を確保できないなど)、サイトは事実上ダウンしてアクセスできなくなってしまいます。そして、「分散された」という点が、この脅威を防ぐのを困難にしている要因

元記事を表示

CompanyユーザからStaffユーザを編集する方法(別モデルからの編集)

必要事項を記載して更新しようとすると、以下のようなことが起きた。
1. current_passwordを正しく入力しても不正とみなされる
1. emailアドレスを変更していない場合でも既に使用されているとしてバリデーションに引っかかる

上記を解消したコードは以下の通り(※備忘録なので詳細説明省く)

“`app/controllers/staffs/registrations_controller.rb
# frozen_string_literal: true
class Staffs::RegistrationsController < Devise::RegistrationsController before_action :set_staff, only: %i(edit update destroy) before_action :authenticate_staff!, only: %i(edit update destroy) load_and_authorize_resource :class => ‘Staff’, except: %i(cre

元記事を表示

【個人開発】プレゼントして欲しいものを謎解きで伝えることができるアプリを開発しました

## はじめに
はじめまして、[sami](https://twitter.com/sammy_study)と申します。
未経験からWebエンジニアへの転職を目指して、プログラミングスクールで学習しています。
この度、プレゼントして欲しいものを謎解きで伝えることができるWebアプリ「ギフトリクエスト」をリリースいたしました。
## サービス名
[**ギフトリクエスト**](https://www.gift-request.com/)

ゲストログイン機能を実装したので、会員登録せずにお試しいただくこともできます。

[![Image from Gyazo](https://i.gyazo.com/eb785f4709dbf556bd5bdc3a226c196e.png)](https://www.gift-request.com/)

**サービスURL**

https://www.gift-request.com/

**Github**

https://github.com/sami-0085/gift_request

## サービス概要
プレゼントして欲しいものがあるけど直

元記事を表示

Rails Ransack 複数カラムを使用した絞り込み検索の実装

検索機能を作っていると、単一のカラムだけではなく複数カラムを使った検索が必要になることがありますよね。
例えば、商品価格と送料を合計した値で絞り込みたいなど。
この記事では、RailsでRansackを使って複数カラムの合計値で絞り込み検索を実装する方法を紹介します。

# 実装の概要
## モデルにransackerを定義する
まず、Productモデルにカスタムransackerを定義します。ここでは、item_priceとshipping_priceを合計したprice_totalという仮想的なカラムを作成します。

“`ruby
class Product < ApplicationRecord ransacker :price_total do Arel.sql('(item_price + shipping_price)') end end ``` ## コントローラでの検索処理 次に、コントローラでRansackを使用して検索を実行します。以下はProductsControllerの例です。 ```ruby class ProductsControll

元記事を表示

Rails: controller層でパラメータをrequireに設定すると空配列が弾かれてしまう

# 奮闘したこと
本記事では、Railsで作成したAPIのリクエストボディに配列をトップレベルで持った時、空配列でputリクエストを送れなくなり、詰まったのでそれを解説します。

Railsの`require`メソッドは、特定のパラメータがリクエストに含まれていることを確認するために使用されます。もし指定されたキーが存在しない、**または値が空である場合**(例えば空の配列`[]`)、Railsは`ActionController::ParameterMissing`エラーを発生させます。これは、`require`がリクエストパラメータの存在とその値の**有効性**を保証するために設計されているためです。

## 空配列がnil扱いされる問題

リクエストボディのトップレベルに配列を用いると意図しない挙動が発生することがあります。具体的には、配列がnil扱いさてしまうのです。これが原因でエラーが発生します。以下は、具体例を用いて説明します。

### 例: リクエストボディのトップレベルに配列を使用する場合
リクエストボディは以下のような形です。
“`json
{
“tag_id

元記事を表示

rails7 確認画面の遷移で沼った話

問合せ画面から確認画面を表示させたかったが
沼ったので共有
rails7のこの事象についてQiitaの記事にもなかったので書いてみる

□状況
問合せ画面から確認画面へPOSTするが確認画面に遷移しない

“`
サーバーのログ
Started POST “/contacts/confirm” for ::1 at 2024-05-15 00:22:22 +0900
I, [2024-05-15T00:22:22.287217 #8971] INFO — : Processing by ContactsController#confirm as TURBO_STREAM
I, [2024-05-15T00:22:22.292437 #8971] INFO — : Completed 400 Bad Request in 5ms (ActiveRecord: 0.0ms | Allocations: 808)
E, [2024-05-15T00:22:22.294219 #8971] ERROR — :
ActionController::ParameterMiss

元記事を表示

【Rails】form_withでデータを送信する際にpostではなくgetを使った話

# はじめに
Railsで予約機能を作成していたら、データを保存しないときのform_withにはgetを使うべきかpostを使うべきか迷ったっため、HTTPメソッドについて改めて調べてみることにしました。

今回はgetを使うことにしたので、その理由とform_withからgetでデータを送信する際にURLがちょっとだけスッキリする記述方法について記録します。
私はこちらを予約機能で使用しましたが、検索機能にも使えそうです。

# 結論
### get
検索機能などによく使われる
ブックマークしたいときに使う
※今回の予約機能ではgetを使用

### post
パスワードなどの秘匿性の高い情報を送信するときに使用
IDなどをURLで指定できないようにしたいときも使える

# getとpostの違い
調べる前の私のgetへのイメージは、
* URLに内容が表示されるから重要なデータには使えない
* 複数のデータを送信するとURLが長くなって見た目が良くない
というようなざっくりしたイメージでした。

https://qiita.com/ryokky59/items/bba97cbfa

元記事を表示

ER図について②

https://qiita.com/takesiumemoto/items/42ba977332aeb4a277ee

前回の続きです。
備忘録のため、記事にします。

4.外部キーで置き換える
 以下は注文テーブルカラムになります。会員氏名というカラムがありますが、ある問題が起こる可能性があります。

![order_data.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788856/1e2081e1-333c-451a-6ed1-347d9991e616.png)
会員氏名を name:stringというデータ型で保存しているため、同姓同名の人がいた場合に識別できなくなってしまいます。

ではどのようにすればよいでしょうか。

![uniqueness.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788856/b12c2db9-e038-100b-0719-63be3f598c03.png)

注文テーブルの

元記事を表示

【+α】初学者がRailsガイドから知見を広げる(’Active Record バリデーション’編 1)

:::note warn
【記事のテーマ】
初級者&中級者向けの書籍である『[独習Ruby on Rails](https://www.shoeisha.co.jp/book/detail/9784798160689)』を基準に
初学者である自分視点で「初級者&中級者向けの書籍には載っていないが公式のドキュメントには載っている少し上級よりな内容」
を取り上げることを目的としています。
:::
***
(参考書籍)
1. [独習Ruby on Rails](https://www.shoeisha.co.jp/book/detail/9784798160689)
2. [パーフェクトRuby on Rails 【増補改訂版】](https://gihyo.jp/book/2020/978-4-297-11462-6)

(参考サイト)
1. [Railsガイド >> Active Record バリデーション](https://railsguides.jp/active_record_migrations.html)
1. [Railsドキュメント](https://rail

元記事を表示

RSpecべからず集(DSLの構築が不適切な事例あれこれ)

## はじめに:これは何?
僕がコードレビューしていて、「ん?いやいや、こんな書き方しちゃダメだよ!」と思ったコード例をまとめた記事です。

この記事でフォーカスするのはRSpecの[DSL](https://e-words.jp/w/DSL.html)を適切に構築してないケースです。

ネタが増えたらまた追記するので、気になる方はこの記事のストックをお願いします!(記事の更新時に通知欄でお知らせします)

それでは以下が本編です👇

## トップレベルのdescribeを2つ以上作らない

“`ruby
# NG
describe ‘Foo spec’ do
# …
end
describe ‘Bar spec’ do
# …
end
“`

テストコードを読む際に、読み手は「当然ファイル全体が大きなひとつのdescribeブロックになっているはず」と信じ込んでいるので、予想に反するネスト構造になっていると脳内の予想と実際の実行結果が異なって混乱します。

以下のように大きなdescribeブロックで囲んで1ファイルにつきトップレベルのdescribeが1つだけ

元記事を表示

Active Storageのファイルアクセス時に独自処理を経由させる方法(Rails v6.1.0以降)

## 経緯
Ruby on RailsのActive Storageを使用していて、ファイルアクセス時に独自処理を挟みたくなったことはありませんか?

https://railsguides.jp/active_storage_overview.html

私はあります。
そんなとき、下記の記事で同じことができそうだったので参考にしていました。

https://qiita.com/karszawa/items/c0f6316217e981d3c6a3

しかし、想定の挙動通りに処理が進まず、苦労しました。

原因としては、Railsのバージョンアップによるものでした。

参考にしていた記事で実施すると、特定のRailsバージョンでは意図通り動作しないため、
`Active Storageのファイルアクセス時に独自処理を経由させたいとき`のRailsv6.1.0以降の方法についてまとめました。

## 参考にした記事に沿って実装してみる
– `app/controllers/active_storage/`配下に、`blobs_controller.rb`を作成
– 下記の通りAct

元記事を表示

ECサイト ER図

# はじまりました
今日からはじまりました!チーム開発&ECサイト開発!
早速ER図を始めて作成したものの、難しいです…
考えるだけでは入ってこなそうなので、アウトプットしていきます!
アウトプットなので、要件定義は省略しております🙇

答えになっちゃうので念の為隠しておきます↓

全体ER図

![スクリーンショット 2024-05-13 20.16.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3782860/131a64a1-5204-8aad-5a80-4de9f0966d2d.png)

各テーブル詳しくみていきます👁️👁️

# 管理者テーブル

ER図

![スクリーンショット 2024-05-13 20.33.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/37

元記事を表示

Next.js14 Server ComponentでのData Fetching

Next13からstableとなったAppRouterを使い、ServerComponentでバックエンドのRailsにAPIリクエストを送る処理を実装したいと思います。

今回、チーム開発でフロントエンドにNext.js14を導入することになりました。

なるべく公式に沿って実装しようということで、AppRouterのServerComponentをフル活用する運びとなりましたが、以前作った自分のPFも、PageRouterを参考にしたためかapp/page.tsxで’use client’を使用しています。ナンテコッタ。これではせっかくのAppRouterが…。

ということで、ServerComponentの使い方を調べつつ、バックエンドのRailsにAPIリクエストを送る実装を作ってみることにしました。

## 環境
Next.js 14.1.4
Rails 7.1.3
Docker

## Server Componentをサラッとおさらい
このあたりは詳しく書かれた記事もたくさんあるので割愛
公式によると、
> AppRouterのデフォルトではサーバーコンポーネントを使

元記事を表示

ActiveAdminのアクション追加例3パターン

## はじめに

ActiveAdminで開発を進めていると独自アクションを追加したいケースがあります。
本記事ではよく使うアクションの追加例を3パターン紹介します。

### アクションとは

Railsのコントローラに記述する`#index`, `#show`, `#new`, `#create`, `#edit`, `#update`, `#destroy`などのことです。

### どのような時にアクションを追加するのか

ActiveAdminでは普段使用する7種類のアクションを用意してくれますが、例えば「全ユーザを一括で更新したい」といった処理はもちろん自分でアクションを書く必要があります。
通常のRailsコントローラならroutes.rbにmemberやcollectionを書けばよいのですが、ActiveAdminではそうはいかないので本記事を書くことにしました。

参考: [Railsガイドのmemberやcollectionの解説](https://railsguides.jp/routing.html#restful%E3%81%AA%E3%82%A2%E3%8

元記事を表示

OTHERカテゴリの最新記事