- 1. Rails – Rspec で現地時間で特定の日付に移動して時間を凍結する
- 2. Railsアプリケーションでの更新失敗時のロールバックとフィードバック
- 3. AIレシピ生成アプリをRails×Next.js×ECSで作ってみた
- 4. binding.pryについて
- 5. あのSQLはActiveRecordを使ってどう書くのか(CASE編)
- 6. RuboCopのExtensions(rubocop-rails)について詳しく調べてみた
- 7. Deviseでのユーザー情報更新時に関連データの誤更新を防ぐ方法
- 8. !/bin/bashを記載しているのにentrypint.shでerrorが発生する場合の解決策
- 9. RubyでPHPのvar_dumpライクな機能を提供するGem『ruby_var_dump』をリリースしました
- 10. 【Rails】Boolean 型を入力必須にする
- 11. CRUDとは
- 12. sidekiq-cron で設定した定期実行処理が schedule ファイルから削除しても停止しない
- 13. validatesの数値チェックについて
- 14. 【Rails6.1】AIチャットと一緒に在庫を減らす処理を考えた話
- 15. Rails ルーティング namespace / module の使い方
- 16. 【Rails】Ruby on Rails 5 速習実践ガイド感想
- 17. 【Ruby on Rails】Rails理念に沿ったビューの共通化
- 18. 【Ruby on Rails】destroyアクションに実装させるturbo_methodとturbo_confirm
- 19. rack-attack だと十分でなく、Web アプリケーションファイアウォール(WAF)を使う理由
- 20. CompanyユーザからStaffユーザを編集する方法(別モデルからの編集)
Rails – Rspec で現地時間で特定の日付に移動して時間を凍結する
“`rb
it do
travel_to Time.zone.local(2024, 1, 1) do
expect …
end
end
“`# 参考
# チャットメンバー募集
何か質問、悩み事、相談などあれば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を利用したユーザー新規登録のテストコード
#### 入力項目
* ニックネーム
* 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_dumpGithub
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**での数値チェックについて書いてみました。
## 内容
#### その1validatesで数値チェックをする場合、基本な書き方はつぎのようになります。
“`
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