- 0.1. Railsのデータベースマイグレーションファイルで適切にロールバックするためのupとdownの設定方法
- 0.2. tagメソッドを使ってビューのコードを簡潔にする方法
- 0.3. as_jsonとto_jsonの違いをまとめてみる
- 0.4. 【学習記録】
- 0.5. params[:id]とparams[:テーブル名_id]との違い
- 0.6. ransackで”数値項目”と”文字列項目”を一緒に検索する場合
- 0.7. rails console -e test
- 0.8. Sidekiq v7.3に導入されたSidekiq::IterableJobについて
- 0.9. associationをキャッシュした場合の速度
- 0.10. 【Rails】ArgumentError (Unrecognized status code :request_entity_too_large)
- 0.11. Rails7.2の新機能と変更点をまとめる【前編】
- 0.12. HTML,CSS,Ruby,Railsなどの参考資料まとめ(自分用)
- 1. HTML
- 2. CSS
- 3. Rails
- 3.1. ・Railsガイド
- 3.2. リダイレクト先をテストする
- 3.3. RailsAPIを使ったSPA構成でのログイン機能を実装する際のブラウザセッション保持
- 3.4. 【個人開発】釣り具の登録、管理、検索ができるアプリを開発しました🎣
- 3.5. Ruby: any?メソッドについて
- 3.6. 実機テスト@Xcodeでエラー「Please reinstall cocoapods with `bundle exec pod install`」が発生した時の対処法
- 3.7. deleteメソッドの戻り値は、最後に削除した要素の値である
- 3.8. RSpecでRailsのテストを書いてみる
- 3.9. [Ruby] メール配信設定の処理における「大きな泥団子」を責務分離した上で、キャッシュ化した話
Railsのデータベースマイグレーションファイルで適切にロールバックするためのupとdownの設定方法
## 経緯
業務の中で、rails db:rollbackを実行した際に適切にロールバックができないというエラーが発生しました。この問題を解決するために、マイグレーションファイルのupメソッドとdownメソッドを調べて適切に設定する方法を見つけ、実装することで問題を解決しました。本記事では、その実装方法を紹介します。
## データベースマイグレーションとは
データベースマイグレーションとは、データベースのスキーマ(構造)をバージョン管理し、変更を適用したり取り消したりする仕組みのことです。これにより、データベースの変更履歴を管理し、開発と運用を円滑に行うことができます。## upメソッドとdownメソッドの重要性
upメソッドはデータベースに変更を加える処理を記述します。対して、downメソッドはその変更を取り消す処理を記述します。これにより、変更の適用とロールバックが容易になり、バグや問題が発生した場合に迅速に対応できます。## 実装方法
#### upメソッドの実装方法
upメソッドには、テーブルの作成やカラムの追加、インデックスの作成などの処理を記述します。
“`
tagメソッドを使ってビューのコードを簡潔にする方法
Railsのviewテンプレートで条件分岐が多くなると、コードが複雑になりがちです。ここでは、ユーザーのステータスごとに「テキストと色」を変更するコードを例に、tagメソッドを使用してシンプルにする方法を紹介します。
## 従来のコード
以下は、ユーザーのステータスに応じて異なるスタイルのバッジを表示する従来のコードです。“`
– case user.status
– when “approved”
span.badge.badge-outline-success.badge-lg = “Approved”
– when “denied”
span.badge.badge-outline-danger.badge-lg = “Denied”
– when “pending”
span.badge.badge-outline-info.badge-lg = “Pending”
– when “partial_denial”
span.badge.badge-outline-warning.badge-lg = “Partial Denial”
– when “u
as_jsonとto_jsonの違いをまとめてみる
## はじめに
ActiveRecordのオブジェクトをJSON形式に直すときはto_jsonを使ってJSON形式に直していると思います。
それとは別に、as_jsonといったものもあります。
初めて見たときは、似てるけど何が違うんだろうと思っていました。
今回は、頭の中を整理しながら、違いをまとめてみようと思います。## as_jsonとは
オブジェクトをハッシュや配列など、JSONエンコードが可能なオブジェクトに変換してくれます。特定の属性を含めたり除外したりできます。
とりあえず、どのような出力となるか試してみます。### 1レコードをas_jsonした場合
1レコードの場合はハッシュ形式で表示されます。
“`rb
@users = User.find(1)## puts @users.as_json
{“id”=>1, “name”=>”山田 太郎”, “email”=>”sample1@sample.com”, “created_at”=>”2024-07-20T13:46:10.150Z”, “updated_at”=>”2024-07-20T13:46:10
【学習記録】
# 記憶トークン
* ブラウザがパスワードを持っていて(cookiesに保存している)、それをハッシュ化させてデータベースのハッシュ化パスワードと照らし合わせる。IDを暗号化したものをユーザーのブラウザに持っておいて、sample_appを経由して復号する。復号済みIDとハッシュ化パスワードを使って、認証を行い、trueならばセッション情報を再構築(復元)する。ユーザーIDは復号させるためハッシュ化しない。
ブラウザが持っているパスワードはランダムで良い。なぜなら、ブラウザとアプリが使用するだけで、人間は間に入らないから。(これを一般的にトークンという。パスワードは人間が作る情報であるのに対し、トークンはコンピュータが作成・管理する情報。)* attr_accessorはメタプログラミング。データベースには保存しない仮想的なもの。
※メタプログラミング:プログラムを記述するプログラムを書くこと。*raiseメソッドを入れるとエラーを網羅的に探索できる。
params[:id]とparams[:テーブル名_id]との違い
プログラミング歴、1年未満の初学者です。
タイトルでもある通り、params[:id]とparams[:cocktail_id](例)との使い分け方について、webアプリを作成中に知ったので、cocktailを例に上げて、書かせていただきます。cocktail = Cocktail.find(params[:id])の場合
一般的に、詳細ページや編集ページに使われ、URL -> /cocktail/1となり、:idパラメータを探します。cocktail = Cocktail.find(params[:cocktail_id])の場合
一般的に、config/routesでネストしたときに使われるそうです。URL -> /users/1/cocktails/1ネストしたときとは↓
“`ruby:routes.rb
resources :users, only: %i[new create]
resources :cocktails do
collection do
get :bookmarks
end
end
“`
ransackで”数値項目”と”文字列項目”を一緒に検索する場合
## はじめに
ransackを使用して、数値項目と文字列項目を一緒に検索した際にエラーが出たので、対処法について記載します。
今回はid(Integer),name(String)でor検索を実装して、どちらかに検索対象文字が含まれていたら表示するというコードを記載している際にエラーが出ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003708/fe7b61c4-c573-4683-937e-5eb612d5513f.png)
## エラー内容
38のついたid(No) / 商品名を検索しようと検索欄に38を入れて検索ボタンを押すと下記のエラーが出ました。
型が異なるので型変換してくださいねといった内容のエラーとなります。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1003708/34833601-f49a-555d-9558-9d9d334fff39.
rails console -e test
# テスト環境のコンソールを使えるようにする
“`
rails console -e test
“`
テスト環境のデータベースにレコードを生成したりすることができた。# 出典
https://teratail.com/questions/289185#:~:text=1-,rails%20c%20%2De%20test,-%E3%81%A7%E8%A9%A6%E3%81%97%E3%81%A6https://railsdoc.com/page/rails_console
# 感想
railsのドキュメントに書いてあったけどできなかった。
バージョンが違うからなのかはわからないができてよかった。
Sidekiq v7.3に導入されたSidekiq::IterableJobについて
## はじめに
Sidekiq v7.3に `Sidekiq::IterableJob` と呼ばれる機能が導入されました。長時間実行されるジョブが安全にデプロイできるようになったとのことです。
* [sidekiq/Changes.md 7.3.0 at main · sidekiq/sidekiq](https://github.com/sidekiq/sidekiq/blob/main/Changes.md#730)
本記事では `Sidekiq::IterableJob` に関連するWiki/Mike Perhams氏の記事/実装を参考に調査を行い、分かったことをまとめます。
## 参考資料
* [Iteration · sidekiq/sidekiq Wiki](https://github.com/sidekiq/sidekiq/wiki/Iteration)
* [Iteration and Sidekiq 7.3.0 | Mike Perham](https://www.mikeperham.com/2024/07/03/iteration-and-sideki
associationをキャッシュした場合の速度
## はじめに
N+1はパフォーマンスに影響することは知っていると思います。
ただ、パフォーマンスに影響するということはわかっても具体的にどれくらいの差があるのかを数値で見る機会は、なかなかったので、キャッシュしないものとキャッシュするものを比較してみたいと思います。## テーブル関係
親usersテーブル、子postsテーブルを用意します。
“`rb:app/models/user.rb
class User < ApplicationRecord has_many :posts, dependent: :destroy end ``` ```rb:app/models/post.rb class Post < ApplicationRecord belongs_to :user end ``` ## seedの用意 以下のようなseedデータを用意します。データの件数は1000件です。 ```rb:db/seeds.rb 1000.times do |n| user = User.create!( name: "山田 太郎", email: "s
【Rails】ArgumentError (Unrecognized status code :request_entity_too_large)
## はじめに
Rails7にアップデート中、request_entity_too_largeを使用している部分でエラーが発生したので、解消方法をまとめていきます。## 問題
コード
“`ruby
render body: nil, status: :request_entity_too_large
“`エラー内容
“`ruby
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms | Allocations: 984)ArgumentError (Unrecognized status code :request_entity_too_large):
“`## 解決方法
Rails4.2からrequest_entity_too_largeはpayload_too_largeに変更されています。
request_entity_too_largeを使用している部分をpayload_too_largeに変更することで解消します。
“`ruby
render body: nil, status
Rails7.2の新機能と変更点をまとめる【前編】
Rails7.2がbetaフェーズとなっています。
リリースに先立ち、新機能や変更点などをまとめつつ、実際に検証してみました。
## devcontainer
Rails7.2ではVSCode上で使えるdevcontainerを設定する機能が追加されました。`rails new`を実行する際に`–devcontainer`オプションを付与できるようになっています。
また`devcontainer`コマンドを実行すれば、既存のRailsアプリケーションでも開発用コンテナの設定が可能です。
以下のIssueで導入の議論がされていました。
https://github.com/rails/rails/issues/50566
### 実際にやってみた
Rails7.1には`devcontainer`コマンドが存在しないのでエラーとなります。
“`bash
rails7.1-app % rails devcontainer
Unrecognized command “devcontainer” (Rails::Command::UnrecognizedCommandErro
HTML,CSS,Ruby,Railsなどの参考資料まとめ(自分用)
HTML
HTML辞典
→HTMLのデジタル辞書。わからなくなったらここから引く。
https://html-coding.co.jp/annex/dictionary/html/
CSS
・CSS辞典
→CSSのデジタル辞書。わからなくなったらここから引く。
https://html-coding.co.jp/annex/dictionary/css/
https://www.tagindex.com/stylesheet/properties/
Rails
・Railsガイド
→Railsのデジタル辞書。わからなくなったらここから引く。
https://railsguides.jp/
リダイレクト先をテストする
“`ruby
require “rails_helper”RSpec.describe UsersController,type: :controller do
describe “create user transition page” do
it “assigns @user” do
post :create, :params => {:name => “hogehoge”, :email => “gehogeho”}
expect(response).to redirect_to(:action => ‘show’,id: assigns(:user).id)
endit “not assigns @user” do
post :create, :params => {:name => “”, :email => “”}
expect(response).to redirect_to(:action => ‘new’)
end
end
end
“`render_template
RailsAPIを使ったSPA構成でのログイン機能を実装する際のブラウザセッション保持
# はじめに
この記事ではRailsAPIを使ったSPA構成(今回はNext.js)でのログイン機能を実装する際のブラウザセッション保持について話します。
Railsチュートリアルで作成したログイン機能をRailsAPIを使ったSPA構成へ変更する際に役立つかと思います。Railsチュートリアルで作成したsessions.rbやヘルパーを持ち越してRailsAPIを使用すると、僕の場合は普通の開発環境でのPC環境と本番環境でのスマホ環境では問題なくログインができるのに、シークレットモードのPC開発環境ではログインができず、本番環境のPCからもログイン機能が使えないという不思議な事態に陥っていました。
しかも、関係あるコードにログ出力コードを付与してRailsログを見ると、ログインが成功しているのにその後のログイン必須のデータ取得ができていないという事態に陥りました。つまり、ログインが成功しているというログが出るのに、すぐその後にログインしていないのでデータが取得できないというログが現れるという不思議な状態です。これはログインが成功しているが、セッションが保存されないために起きて
【個人開発】釣り具の登録、管理、検索ができるアプリを開発しました🎣
# はじめに
こんにちは![レイ](https://twitter.com/ida09r)と申します!未経験からエンジニア目指して日々学習をしております。
今回、釣り道具に特化した「[Tackle Master(タックルマスター)](https://tacklemaster.net/)」というサービスを開発しました。
釣りに興味のある方や好きな方には、ぜひ使っていただけると嬉しいです。
### 自己紹介
地元の工業高校で情報系コースを専攻し、PC操作やプログラミング(Python、SQL、HTML/CSS)を簡単に学びました。
卒業後は総合化学品メーカーで製造オペレーターとして約3年間勤務。その際、社内ITシステムに助けられた経験から、システム開発に興味を持ちました。2024年2月からプログラミングスクール「RUNTEQ」に入学し、エンジニアを目指しています。
# 1.サービス紹介
「Tackle Master」は釣り道具に特化したサービスで、釣り道具の管理・登録・検索ができます。
![tackle_service.jpg](https://qiita-image
Ruby: any?メソッドについて
補足 2024 07/19
@scivolaさんよりご指摘いただいた内容を反映## 読んで欲しい人
– any?メソッドがわからん人
– 過去の俺## 動作環境
– ruby 3.3.0
## any?メソッドとは
– 配列やハッシュなどのコレクションに対して使用する
– ~~要素内に1つでもtrueを見つければtrueを返す。全ての要素がfalseならfalseを返す~~
– 1 つでも真な要素があれば true を返す。全ての要素が偽なら false を返す“`ruby
[nil, false, nil, false, true].any?
=> true
“`– ブロックで条件を指定できる
“`ruby
[1, 2, 3].any? { |v| v > 3 }
=> false
“`*追記: 2024/07/19*
– 全ての要素が偽というのは、要素がない場合にも成り立つ“`ruby
[].any?
=> false
“`## なんで配列、ハッシュの要素1つ1つをチェックできるのか?
`any?`はEnumerableモジュール
実機テスト@Xcodeでエラー「Please reinstall cocoapods with `bundle exec pod install`」が発生した時の対処法
## 背景
iPhone7@Xcode14.3.1で実機テストを実施しようとした(再生ボタンをクリックした)ところ、「Please reinstall cocoapods with `bundle exec pod install`」というエラーが発生しました。エラーの対処方法を紹介します。## 環境
macOS Monterey:12.1
Ruby:3.0.6
Rails:6.1.0
React Native:^0.74.3
expo SDK:~51.0.20
bundler:2.5.3、2.4.13(default:2.4.13)
node:16.20.0
npm:8.19.4
yarn:1.22.19
webpack:4.46.0
※エディターは、VSCodeを使用しています。
※デプロイ先は、herokuです。## 問題
・Xcodeのログに、以下のエラーが発生しました。
“`
Codegen did not run properly in your project. Please reinstall cocoapods with `bundle exec pod i
deleteメソッドの戻り値は、最後に削除した要素の値である
Action Mailerを使って、アプリに登録されている全ユーザにメールを送信するという実装をしたのですが、メールが飛ばないというような事がありました。
実際のコードがこちらです!
“`ruby
@posts = Post.yesterday_liked_ranking_top_ten
mail(to: User.pluck(:email).delete(”), subject: default_i18n_subject)
# emailを登録していないユーザもいるので、空であれば削除する
“`
emailを登録していないユーザもいるので、pluckして取得した値のうち、空文字は削除するといった実装です。
この時点で既にお気づきの方もいらっしゃると思いますが、この記述だとmailのto引数には空を渡してしまうのです。実際にコンソールで挙動を確認してみましょう!
“`ruby
>> emails = User.pluck(:email)
User Pluck (1.0ms) SELECT “users”.”email” FROM “users”
=> [“”, “”,
RSpecでRailsのテストを書いてみる
# はじめに
Railsの自動テストを学ぶにあたって、RSpecでの実装方法を勉強したので書き残していく。
Ruby:3.2.1
Rails:7.1.2
# RSpec のセットアップ
gemの追加。`rspec-rails`をGemfileに追加する。
“`ruby:Gemfile
group :development, :test do
gem ‘rspec-rails’
end
“`
テスト用のデータベースを設計。今回はSQLiteを採用。
“`ruby:config/database.yml
test:
<<: *default database: db/test.sqlite3 ``` RSpecの基本的な設ファイルの追加。 ```shell-session $ rails generate rspec:install ``` ## テストの作成 モデル/ビュー/コントローラーでそれぞれテストを作成していく。 RSpecの基本的な書き方は以下。 ```ruby RSpec.describe User, type: :mode do it
[Ruby] メール配信設定の処理における「大きな泥団子」を責務分離した上で、キャッシュ化した話
## 問題点
メール配信設定に関する機能についてです。SendGrid では、メール配信を行うために (CNAME・ないし MX/TXT 形式の)DNS 登録・及び認証が必須となっており、その認証状態を確認するための [Domain Validation API](https://www.twilio.com/docs/sendgrid/api-reference/domain-authentication/validate-a-domain-authentication) が提供されています。
その DNS 認証を行うための処理をクラス化していたのですが、無関係の様々な処理(例えば「メール配信結果にまつわる情報取得など」)も役割を持たせられており、責務が肥大化し、いわゆる「大きな泥団子」と化していました。
その状態で過剰にリクエストされた結果、ある時 SendGrid API から Rate Limit 超過エラーを受け取るケースが発生しました。
## 分析
まず掲題の外部 API が許容している Rate Limit の詳細を確認しました。公式ドキュメントを見ても詳細