- 1. 投稿アプリのコントローラーの単体テストコード
- 2. 認証と認可について基本情報をまとめてみた
- 3. 【JWT】復号後データのハッシュキーに関するエラー
- 4. 【RubyOnRails】モーダル実装時の考えをなぞる #初心者向け
- 5. Rails lock! のメモ
- 6. 投稿アプリのモデルの単体テストコード
- 7. Turboとは
- 8. 新年をスタートさせるためのミニゲームを作りました
- 9. findとfind_byの違い
- 10. ルーティングの記述方法
- 11. 効率的にテストコードを書こう
- 12. N+1問題を解決する
- 13. 忘れやすいRspecのletとlet!の違い
- 14. Rails初心者の学習日記 CRUDの基本
- 15. Zip格納されたCSVファイルをHTTPレスポンスから直接取り出す
- 16. Railsのエラー解消
- 17. 原因不明だったRDS負荷のスパイクを改善できた話
- 18. Rails APIとReactを使用したウェブサイトのXSSとCSPの対策について
- 19. 投稿機能の検索機能の実装
- 20. jbuilderでJSONを生成する
投稿アプリのコントローラーの単体テストコード
モデルのテストはよくしていましたが、コントローラーはあまりやっていなかったので
いい復習になりました!### 目的
– Request Spec の流れを理解
– レスポンスを判定するテストコードを記述### コントローラーの単体テストコード
#### テストコードを書く方針
あるアクションをリクエストを送った時、想定通りのレスポンスが生成されるかどうか確かめる
### Request Spec
コントローラーのテストコードを書くために特化した手法`rails g rspec:request tweets`
### tweetsコントローラーindexアクションの単体テストコード
#### exampleを整理
– indexアクションにリクエストすると正常にレスポンスが返ってくる
– indexアクションにリクエストするとレスポンスに投稿済みのツイートのテキストが存在する
– indexアクションにリクエストするとレスポンスに投稿済みのツイートの画像URLが存在する
– indexアクションにリクエストするとレスポンスに投稿検索フォームが存在する####creat
認証と認可について基本情報をまとめてみた
## はじめに
RailsでJWTを使用するに認証と認可の違いについて調査したため、基本的な情報をまとめます。## 認証と認可について
### 認証(Authentication)
認証は、ユーザーが彼らが主張する人物であることを確認するプロセスです。
アクセスを試みる個人が彼ら自身であることを証明するために必要です。### 認可(Authorization)
認可は、認証されたユーザーがアクセスできるリソースや実行できるアクションを決定するプロセスです。
認証に成功した後、システムはユーザーの権限をチェックして、彼らが特定のファイルにアクセスしたり、特定の操作を実行したりできるかどうかを決定します。図で表すと以下のようなイメージです。
青色部分が認証、紫部分が認可を表しています。“`mermaid
sequenceDiagram
%%{init:{‘theme’:’base’,’themeVariables’:{‘primaryColor’:’#6A7FAB’,’primaryTextColor’:’#FAFBF9′,’primaryBorderColor’:’#
【JWT】復号後データのハッシュキーに関するエラー
## はじめに
私がJWT認証で発生したちょっとしたエラーを紹介します。
## JWTとは
JWT(JSON Web Token)は、認証情報をJSON形式で安全に交換できる方法のことです。
詳しい説明は以下の記事を参考にしてください。
https://developer.mamezou-tech.com/blogs/2022/12/08/jwt-auth/
## 実行内容
Postmanで`http://127.0.0.1:3000/api/users`にGETメソッドを送り、全ユーザー情報の取得。
※Requestのheaderに以下の認証情報を設定しています。
キー:Authorization 値:Bearer {{jwt token}}“`ruby:routes.rb
Rails.application.routes.draw do
namespace :api do
resources :users# ・
# ・
# ・end
end
“`“`ruby:users_controller.rb
modul
【RubyOnRails】モーダル実装時の考えをなぞる #初心者向け
# 概要
モーダル実装時に考えたことをなぞり、思考回路を文章化しました。# 対象者
– モーダルを見たことがあり、モーダルのイメージが湧く。
– ボタンをクリックした後に表示するモーダルを作成したいと思っている。
– 実際の実装方法がわからない。# 作りたいモーダル
1. ボタンをクリックした後に、モーダルが表示される。
2. 表示されたモーダルには、説明文がある。## 1. 導線
モーダル作成を考えるときに、まず初めに思い浮かべることは【導線】です。
モーダルはページ遷移を伴いませんが、新しいViewが必要になることが予測されます。
また、Viewを表示するためには **アレ** を準備する必要があります。
:::note
route.rb の中にルート(導線)を書きましょう。
:::## 2. アクション
ルート(導線)が準備できたら **アレ** を準備する必要があります。controllerの中にアクションを書きましょう。
アクション名はモーダル内容によって命名してください。
またルート(導線)とアクションを作成した後は、“`binding
Rails lock! のメモ
ふとした時に lock! の挙動が気になるのでメモしておく。
## 前提
– Postgresql
## テスト1
以下のコードを console A, console B 両方に貼り付けて、A -> B の順に実行
“`ruby
ActiveRecord::Base.transaction do
User.first.lock!
sleep 10
puts ‘foo’
end
“`### console A
“`sql
TRANSACTION (0.1ms) BEGIN
User Load (0.8ms) SELECT “users”.* FROM “users” ORDER BY “users”.”id” ASC LIMIT $1 [[“LIMIT”, 1]]
User Load (0.8ms) SELECT “users”.* FROM “users” WHERE “users”.”id” = $1 LIMIT $2 FOR UPDATE [[“id”, 4], [“LIMIT”, 1]]
foo
TRANSACTION
投稿アプリのモデルの単体テストコード
テストコードは本当に理解できず一周目は正直飛ばしてましたが
復習してなんとなく理解できました!
というわけで復習の備忘録です!目的
– Userモデルの単体テストの実装を通して、正常系テストを理解
– Userモデルの単体テストの問題を解いて、異常系テストに関する知識を定着
– Tweetモデルの単体テストの問題を解いて、モデル単体テストに関する知識を定着####文字数制限のバリデーションを設置
「保存できる値は最大6文字まで」というバリデーションを設置
app/models/user.rb
“`ruby
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :reme
Turboとは
# Turbo
Turboは、Rails7以降を使用している方は必須の知識かと思います。Railsで掲示板アプリの削除機能実装中に、ダイアログ機能を実装したつもりがダイアログが表示されず、即削除されてまい、意図した挙動をしなかった原因を追求したところ、Turboについて理解ができていなかったので、この記事でアウトプットとしていこうと思います。
## Turboとは
Turboを理解する前に、Hotwireを知っておく必要がある。
## Hotwire
Hotwireとは、Rails7からRailsのデフォルトになった、モダンなWebアプリケーションを作るための新しいアプローチ。もう少し、詳しく説明すると、
サーバーサイドで生成されたHTMLを直接ブラウザに送信し、JavaScriptを最小限に抑えて、より高速でインタラクティブなウェブアプリケーションを構築することができるRuby on Railsのフレームワーク。SPAではないが、React等のjsライブラリを使用せずに、SPA風のUXを実現することができるRailsのフレーワークというイメージだろうか。
##
新年をスタートさせるためのミニゲームを作りました
## 概要
RUNTEQのミニアプリウィークにて、制限時間内に「スタート」ボタンが何回押せるかを競うミニゲームを作成しました。このゲームは、シンプルながらもユーザーの反射神経と速さを試すことができます。
また、ログインするとランキングに参加できます。ユーザ名とパスワードで登録できるので、興味がある方は試してみてください。
https://peaceful-meadow-78483-bad183e58e63.herokuapp.com/
![スタートクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/849608/63db705c-9eb2-0b2a-4186-599d7b35cf70.png)
## 技術構成
### バックエンド
RUNTEQで学んだRailsを活用しました。ただ、RailsではURIの管理のみにし、画面作成はReactに任せました。
このRailsとReactのつなぎの部分には、react-railsというgemを使用しました。
一行書くだけでReactに値を
findとfind_byの違い
# はじめに
`find`と`find_by`は、Railsでデータベースからレコードを取得するためのメソッドですが、いくつかの違いがあります。
findとfind_byの違いについて理解が曖昧だったため備忘録も兼ねてまとめます。
# 検索条件の指定方法
`find`: 主キー(通常はid)を指定してレコードを取得します。例えば、`User.find(1)`は`id`が1であるユーザーを取得します。`find_by`: 様々な条件を指定して検索できます。例えば、`User.find_by(name: ‘John’)`は`name`がJohnであるユーザーを取得します。
“`ruby
# 主キーを指定して取得
user = User.find(1)# 条件を指定して取得
user_by_name = User.find_by(name: ‘John’)
“`
# エラーハンドリング
`find`: 主キーが見つからなかった場合、`ActiveRecord::RecordNotFound`例外が発生します。主キーが存在しない場合、エラーが発生するため注意が必要です。`fin
ルーティングの記述方法
# はじめに
ルーティングの記述方法の理解が曖昧だったため備忘録も兼ねてまとめます。
# ルーティングとは
Webアプリケーションにおいて、クライアントからのリクエストを処理するために、どのコントローラのどのアクション(メソッド)が呼び出されるかを指定する仕組みです。Railsでは、config/routes.rbファイルでルーティングを設定します。
“`config/routes.rb
Rails.application.routes.draw do
root “sample#index”
get “/new” => “sample#new”
post “/create” => “sample#create”
resources :articles
end
“`
# Rootとは
ルートは、アプリケーションのトップページを指します。上記の例では、SampleControllerのindexアクションがルートに設定されています。
# GETとは
indexアクションやshowアクションのようにデータの取得が目的のアクションです。
# POSTとは
c
効率的にテストコードを書こう
テストコードを効率的にできるのは便利ですね!
“`ruby“`
### 目的
– FactoryBotの概要と設定の方法を理解
– Fakerの概要と設定の方法を理解### インスタンスを生成するコードを分離
#### FactoryBot
インスタンスをまとめることができるGem。他のファイルであらかじめ各クラスのインスタンスに定める値を設定しておき、各テストコードで使用する### FactoryBotを導入
“`ruby
group :development, :test do
# See https://guides.rubyonrails.org/debugging_rails_applications.html#debugging-with-the-debug-gem
gem “debug”, platforms: %i[ mri mingw x64_mingw ]
gem ‘rspec-rails’, ‘~> 4.0.0’
gem ‘factory_bot_rails’
end
“`
`bundle install`
specディレクトリ
N+1問題を解決する
# 1.はじめに
投稿一覧画面にて無駄なクエリが発生していたので解決方法を備考録として記事に残します。# 2.環境
Ruby (2.6.4)
Rails (6.1.7)
gem kaminariを導入している# 3.N+1とはなにか
ざっくりいうと不必要なSQLを何回も発生させてしまう現象のことです。
それによりDBへの問い合わせ処理が複数回走るためパフォーマンスが悪化します。例えば、スーパーにりんご、みかん、いちごを買いに行こうとしていたとします。
そのとき、何度も自宅とスーパーと往復せず、まとめて購入するでしょう。N+1問題は、この例でいくと自宅とスーパーと何度も往復することにあたります。
1往復1食材しか持っていかなかったら効率悪いです。1往復で買い物を終わらせようというのがN+1問題を解決するということです。
# 4.おこなったこと
## 修正前
page(params[:page])について
gem kaminariを導入しているのでこのような記述になっていますが、page(params[:page]) ≒ all: と考えてください。
“`:con
忘れやすいRspecのletとlet!の違い
# はじめに
rspecのletとlet!の違いを忘れてしまうことが多いのでここにメモする# 問題
letとlet!はRSpecのヘルパーメソッドで、テスト内で使用するデータを定義するために使われます。しかし、それらはいつデータが生成されるかという点で違いがあります。
このような場合はcourseが複数保存されている必要があるのでlet!で定義しないとなにも保存されていない状態になります。
“` ruby
get “/api/v1/courses”
expect(JSON.parse(response.body)[0][“authority”]).to eq(course.authority)
expect(JSON.parse(response.body)[0][“travel_mode”]).to eq(course.travel_mode)
expect(JSON.parse(response.body)[1][“authority”]).to eq(other_course.authority)
expect(J
Rails初心者の学習日記 CRUDの基本
## はじめに
Railsの学習を始めたばかりの初心者です。私がRailsで学んだCRUD処理の基本について共有します。## Railsとは
Rails(Ruby on Rails)は、Ruby言語をベースにしたWebアプリケーションフレームワークです。Railsの大きな特徴は、開発を迅速化し、簡素化するための多くの機能を備えている。## CRUDとは
CRUDは「Create(作成)」「Read(読み取り)」「Update(更新)」「Delete(削除)」の頭文字を取ったもので、データベースの基本的な操作を指します。これらの操作は、Webアプリケーションにおいて非常に重要されるようです。Create(作成): 新しいデータをデータベースに追加します。
Read(読み取り): データベースからデータを検索・取得します。
Update(更新): データベース内の既存のデータを変更します。
Delete(削除): データベースからデータを削除します。## RailsでのCRUD処理
Railsでは、これらのCRUD操作を簡単に実装できる。ブログアプリケーションを例に説明しま
Zip格納されたCSVファイルをHTTPレスポンスから直接取り出す
## TL;DR
オープンデータを提供しているサイトから、ZIPファイルに格納されたCSVファイルをダウンロードし、データを取り出す際、ダウンロードしたファイルを一旦保存して処理するアプローチを取りたくなかったので、HTTPレスポンスからストリーム経由で直接データ抽出するアプローチを採用してみました。
HTTPクライアントにはfaradayを採用していますが、通信周りの処理見直しは必要なものの、他のライブラリでも大丈夫だと思います。
他の方の参考になれば幸いです。
### 留意点
HTTPレスポンスが分割されるケース(チャンク形式)に耐えられるか確認してません。
“` ruby
require ‘faraday’
require ‘stringio’
require ‘zip’class FetchCsvService
BASE_URL = ‘https://www.opendata.metro.tokyo.lg.jp/’
def initialize
@conn = Faraday.new(BASE_URL) do |builder|
Railsのエラー解消
プログラミングはエラー分との戦いです
ただエラー文はHELP(手助け)してくれるものです。
エラーが出てガッカリしず、成長できるものとして捉えましょう!### 目的
– デバック方法を理解
– 仮説と検証の習慣webアプリの開発中は、エラーが頻繁に起きます。
エラー解決を重ねることで、Railsの全体像や仕組みの理解が深まります「No methodError in Tweets#index」
「定義されていないメソッドが呼び出された」というエラーが、
Tweetsコントローラーのindexアクションが実行されたタイミングで
生じたことを表すエラー内容がわかったので、解決の仮説をたて修正し、検証します。
仮説が建てられない場合は、その他の情報を加味しながら仮説をたて、
検証を行うくり返の作業になります#### デバック
プログラミングの間違い(バグ)を見つけて、手直しすること
#### pry-rails
Gem
デバックツールに属し、作業の際にバグの有無を確認したり、処理を止めてソースコードを正しいかを確認できるものです。
`binding.pry`という記述をソース
原因不明だったRDS負荷のスパイクを改善できた話
# 概要
当時数ヶ月間誰も原因がわからなかった一時的にRDSの負荷(CPU使用率)がスパイクする現象の原因を調査できる環境を整えて、原因分析〜改善まで実施したときの話です。1つ1つの取り組み自体は大きなことはやっていませんが、一連の動きで得られたものも多かったのでアウトプットしようと思い記事にまとめました。
# 取り組んだ課題
## 原因を特定するためのツールがない
そもそも何が原因でRDSのCPU負荷が高まっているのかを調べるための情報がCPU使用率以外に全くない状況でした。
そこでRDSの負荷原因を探る方法を調べると、Performance InsightsやCloudWatch Logsへのスロークエリログ出力を使う記事をいくつか見つけたのでこの2つについて調べることにしました。– ### [Performance Insights](https://aws.amazon.com/jp/rds/performance-insights/)
データベース負荷をSQLなどの単位で時系列で可視化したり、トップSQLやDBのヘルスメトリクスを見れるRDSの機能です。アプリのパ
Rails APIとReactを使用したウェブサイトのXSSとCSPの対策について
### はじめに
Ruby on Rails APIとReactを使用したウェブアプリケーションのセキュリティ設計について、
特にXSS(クロスサイトスクリプティング)とCSP(コンテンツセキュリティポリシー)に焦点を当ててまとめました。## XSS(クロスサイトスクリプティング)
XSSは、ウェブページに不正なスクリプトが注入され、エンドユーザーのブラウザ上で実行されるセキュリティ攻撃です。
これにより、ユーザーのセッション情報の盗用やマルウェアの配布などが発生するリスクがあります。### Railsにおける対策
**JSONレスポンスのサニタイズ** :
– JSON形式でデータを返す場合は、適切にエスケープ処理を行います。**パラメータの検証** :
– 入力されたデータを適切に検証し、不正な入力を防ぎます。
**Strong Parameters** の使用: 不要なパラメータをフィルタリングします。### Reactでの対策
**データバインディング**:
– ReactはデフォルトでHTMLをエスケープしますが、dangerouslySetInnerH
投稿機能の検索機能の実装
検索機能は必須機能ではないですがあると便利ですね!
テックキャンプの備忘録です!### 目的
– ルーティングのcollectionとmemberを理解
– 検索に必要なメソッドを理解### seachアクションのルーティング設定
#### collectionとmember
ルーティングを設定する際に使用でき、生成されるルーティングのURLと実行されるコントローラを任意でカスタムできる
ルーティングに`:id`がつくかつかないかの違い
config/routes.rb
“`ruby
Rails.application.routes.draw do
devise_for :users
root to: ‘tweets#index’
resources :tweets do
resources :comments, only: :create
collection do
get ‘search’
end
end
resources :users, only: :show
end
“`### 検索フォーム作成
app
jbuilderでJSONを生成する
# はじめに
jbuilder は、Ruby on Rails で JSON を生成するための Gem です。
この記事では、jbuilder の基本的な使い方をまとめてみました。# 環境設定
### Gem のインストール
Gemfile に jbuilder を追加するために、以下の行を追記します。
“`ruby:Gemfile
gem ‘jbuilder’
“`その後、以下のコマンドを実行して、Gem をインストールします。
“`bash
bundle install
“`# 使い方
### controller ファイルの設定
コントローラーで、JSON 形式でデータを返すように設定します。
例えば、[respond_to](https://railsdoc.com/page/respond_to)メソッドを使用して、JSON 形式のレスポンスを許可することができます。“`ruby:app/controllers/UsersController.rb
class UsersController < ApplicationContro