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

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

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

元記事を表示

ER図について

データベース設計について
 Rubyonrails初学者になります。備忘録のために記事を投稿します。

現在はチーム開発カリキュラムを学習しており、データベース設計という単語がでてきました。

データベース設計とは?
 どのような情報をどういった構造でデータベース化するのか設計することをデータベース設計というらしい。

データベース設計に必要なこと
 1.エンティティを洗い出す
 エンティティとはテーブルのこと。実装したい機能に従って必要なテーブルを作成する。

2.要件から情報を抜き出す
 例えば商品テーブルでいくと、商品名であったり、商品の紹介文であったり、カラムにあたる部分

 3.重複する部分は分割する
  この部分は私にとって理解が難しかった部分にあります。
注文テーブルを例にとって理解しました。
![スクリーンショット 2024-05-13 003510.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788856/511f01d5-f767-9c62-eac

元記事を表示

【Rails】form_withからhidden_fieldでデータを送る際のポイント

# はじめに
Rails6.1での予約機能の作成時に、予約を確定する前に確認画面を挟むことにしました。

その際に商品のデータを渡す方法に戸惑ったので、どのように実装したか記録しておこうと思います。

# 結論
今回私がデータをうまく渡せなかったのは、paramsの使い方をきちんと理解できていなかったことが原因でした。

ビューからform_withを使ってコントローラにデータを渡し、送られたデータをコントローラで受け取るためにはparamsを使用します。

paramsはハッシュでデータが格納されるので、キーが必要になります。
私はこちらの認識が抜けていました。

“`ruby:
customer = Customer.find_by(email: params[:customer][:email])
“`
form_withから@​customerでmodelを指定して送ったデータを受け取るには、上記のようにキー[:customer]が必要になります。

# createまでitem_idを渡す方法を考える
今回私がやりたかったのは、
商品詳細(show)から予約

元記事を表示

[Codespace] railsサーバー再起動方法

## 対象
GitHubのCodespaceを使って開発している方

## 前提
codespaceを立ち上げた状態でターミナルのコマンドで再起動します

## 手順
1. 起動中のプロセスIDを確認する
入力コマンド ※「$ 」はターミナルを意味するので入力は不要です
$ cat /workspaces/[リポジトリ名]/tmp/pids/server.pid
-> xxxxx(数字)
2. サーバーを停止する
$ kill -9 xxxxx ←手順1で取得したプロセスID
3. 再度サーバーを立ち上げる
$ rails server

元記事を表示

file_fieldのデザインを変更する

### きっかけ
file_fieldのデザインをデフォルトのものから変更したいと思いましたが、
UIkitでは単数のfile_fieldのclassは用意されているものの、
複数用のfile_fieldは用意されていなかったので、
自分で変更する方法を調べて変更してみました。

初学者のため、誤りがありましたらご指導いただけると幸いです。

### 環境
Rails7.1
UIkit
ActiveStorage
stimulus

前提として
すでにmodelやdb等は作成してあるとして進めさせていただきます。

### 完成系のイメージ
送信ボタンにはUIkitのデザインをあててます。
![スクリーンショット 2024-05-11 14.06.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3624777/43b74c9b-30ee-d72a-c07f-0f0ab5220e00.png)

file選択ボタンの部分をデフォルトから
![スクリーンショット 2024-05-11 14.08.53.

元記事を表示

【rails】Herokuに画像が表示されない

# はじめに

– `assets/images/logo.jpeg` に画像を保存し,imgタグにてパスを参照してブラウザ表示を試みた。
– 上記ローカル環境にて表示することはできたが、“heroku“にデプロイした環境では表示させることができなかった。

# やったこと

– 拡張子が `jpeg` になっていた→ `jpg` に修正する。
– `img` タグで記述を `image_tag` に修正する。
– `assets/images/x_logo.jpg` で絶対パス指定していたものを、 `x_logo.jpg` の形で相対パスに変更する。
– 修正後のコード↓

“`ruby
.login
.text-center
= image_tag ‘x_logo.jpg’ ,alt: ” ,width: ’60’ ,height: ’57’
h3.text-center サインアップ

“`

# 結果

– 開発環境、Heroku本番環境の両方でアイコンの画像を表示させることができた。

# 参考

https://qiita.com/jnchito/

元記事を表示

【rails】viewの共通applicationを切り分ける

# やりたいこと

– deviseを用いたログイン、サインアップ画面と通常のメイン画面とで、共通のviewを切り分けて表示させたい。
– (例)メニューヘッダー,サイドバーはログイン画面には表示させたくない

# やったこと

1. ユーザー認証用のHTMLを作る

2. ApplicationControllerに描画の切替を制御する記述をする

ユーザー認証用のHTML(ファイル名は任意)のファイル名で作って、`app/views/layouts/`配下に作る

※`app/views/layouts/devise.html.erb`で作るとします

devise.html.erb

“`jsx



Sample
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'rel

元記事を表示

OTHERカテゴリの最新記事