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

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

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のヘルスメトリクスを見れる機能です。アプリのパフォーマ

元記事を表示

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

元記事を表示

Ruby on Railsにおける秘匿データの扱い:メリット、デメリット、および管理方法

#### 秘匿データとは?
Railsアプリケーションでは、APIキー、データベースのパスワードなど、外部に漏れるとセキュリティ上のリスクが高まる情報を「秘匿データ」と呼びます。これらは通常、ソースコードとは別に安全に管理する必要があります。

#### 管理方法の選択肢
1. **環境変数 (ENV)**
2. **Rails Credentials**

## 環境変数 (ENV)
– **メリット:**
– 簡単に設定でき、多くのホスティングサービスがサポート。
– ローカルと本番環境で異なる値を設定しやすい。

– **デメリット:**
– 環境によって設定方法が異なる可能性がある。
– アプリケーションが多くなると管理が煩雑に。

## Rails Credentials
– **メリット:**
– ファイル内にすべての秘匿情報を集約できる。
– 暗号化されているため、安全性が高い。

– **デメリット:**
– `master.key` の管理が必要であり、これが漏れるとセキュリティリスクに。
– 初期設定が環境変数よりも複雑。

## ど

元記事を表示

Rails: JavaScript からコントローラの POST メソッドに対して非同期でリクエストを送信する

一定の時間が経過したら強制的に投稿するフォームを作成する。
questionsコントローラのsubmitメソッドに対し、選択した`choice_id`を送信する。

“`html
<%= form_with(url: submit_questions_path, method: :post) do |form| %>

<%= form.radio_button :choice_id, 1 %>
<%= form.radio_button :choice_id, 2 %>
<%= form.radio_button :choice_id, 3 %>

<%= form.submit '投稿' %>
“`

もちろん、上記のフォームで選択をして投稿ボタンを押せば投稿ができる。
しかし今回は、一定の時間が経ったらjavascriptで強制的に投稿させる。
それをしてくれるjavascriptは以下。
viewにベタ打ちなどして記述する。

“`javascript

var postAfterSeconds = 5;
setTimeout(function()

元記事を表示

DockerでRails7.1.2×PostgreSQLの環境構築

# はじめに
今回は初めてDockerを使って環境構築してみたので、そのまとめを残していきたいと思います。

https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/rails

こちらのリポジトリを参考に
– Ruby: 3.3.0
– Rails: 7.1.2
– wsl2
– Docker Desktopインストール済み
– composeでsecretsを使う

で環境構築しました。

# 環境構築のステップ
まずはファイルを6つ用意します。
– Dockerfile.dev
– compose.yaml
– Gemfile
– Gemfile.lock
– entrypoint.sh
– db_password

それぞれ中身を見ていきましょう。
まずは`Dockerfile.dev`から、名前はなんでもいいのですが、Rails7.1以降の仕様から.devをつけています。
“`Dockerfile:Dockerfile.dev
# syntax=docker/d

元記事を表示

Docker + MySQL + Rails5環境でRailsコンテナが起動できない問題

# 環境
Ruby:2.4.6
Rails:5.2.8
MySQL:5.7

# 対処法
タイトルの通り、以下のコマンドを実行後にRailsコンテナが起動しない(Exit1)事態に陥りました。

“`
docker-compose up -d
“`
ログは次のようになります。
“`
web_1 | /usr/local/bundle/gems/loofah-2.21.1/lib/loofah/html4/document.rb:10:in `‘: uninitialized constant Nokogiri::HTML4 (NameError)
web_1 | Did you mean? Nokogiri::HTML
web_1 | from /usr/local/bundle/gems/loofah-2.21.1/lib/loofah/html4/document.rb:4:in `
web_1 | from /usr/local/bundle/gems/loofah-2.21.

元記事を表示

【3日目】フロントエンジニアがRailsを習得するまで

# 3章 ほぼ静的なページの作成

## railsの省略コマンド

“`
rails server -> rails s
rails console -> rails c
rails generate -> rails g
rails test -> rails t
bundle install -> bundle
“`

## `rails g` で作成したものをまとめて削除

`rails g` でmodelやcontrollerの命名を変更したい。
でも `rails g` は複数のファイルに変更を加えるので、修正が面倒。。

そういう時に使うのが `rails destroy` 。
このコマンドによって `rails g` で作成した各種変更を取り消してくれる。

### 1. Controllerを取り消す場合
`rails destroy` コントローラー名`

### 2. Modelを取り消す場合
`rails destroy モデル名`

### 3. migrateしたDBを戻す場合
`rails db:rollback`

#### ~

元記事を表示

なんでmodelで定義してるUserクラスをcontrollerで使えるの?

動機

Railsチュートリアル7章まで進めて、ふとこの疑問が湧き上がりました。
Rubyの基本的な文法を学習した段階では、

  • 原則同じファイル内で定義したクラスしか使えない
  • 外部のファイルのクラスを使う場合はrequireで読み込む必要がある
  • クラスの継承を使えば、親クラスのメソッドも使用できる

という理解だったのですが、railsチュートリアルのsample_appのusers_controller.rbのコードを見ると

  • ファイル内にUserクラスの定義がない
  • にもかかわらず@user = User.find(params[:id])みたいな感じでUserクラスを使ってる
  • requireで外部ファイルを読み込んでる、もしくはクラスを継承している様子もない

みたいな感じでなぜUserクラスが使えているのか理解できなかったので調べてみました。

<

元記事を表示

ReactとRailsアプリケーションにおける環境変数を無理やり共通化したかった

### 背景
この記事では、Reactをフロントエンドとして、Railsをバックエンドとして使用するアプリケーションの例を取り上げ、両者間での環境変数の共有方法について説明します。

## 問題の概要
ReactとRailsの両方で使用する環境変数がある場合、例えばAPIのエンドポイントやOAuthのクライアントIDなどがある場合に、これらの環境変数の管理が同期的である方が好ましいよな?(個人的な意見)と思いました。

## 考えた解決策
バックエンド(Rails)の .env ファイルから環境変数を読み取り、
それをフロントエンド(React)用の .env ファイルに転送するシェルスクリプトの作成。
この方法により、環境変数の一元管理が可能になりそうだと思った。

スクリプトの実装
“` shell
# バックエンドの .env ファイルのパス
BACKEND_ENV_PATH=”./backend/.env”

# フロントエンドの .env ファイルのパス
FRONTEND_ENV_PATH=”./frontend/.env”

# フロントエンドの .env ファイルをクリ

元記事を表示

public, private, protected

# それぞれの違い
## Public
Publicメソッドは、クラスの外部から自由にアクセス可能です。
これらはクラスのインターフェースを形成し、外部のコードから利用されることを意図しています。
Rubyでは、クラスで定義されたメソッドはデフォルトでpublicです(ただし、initializeメソッドは例外で、常にprivate)。

## Private
Privateメソッドは、そのクラスのインスタンスからのみアクセスできます。
これらのメソッドは、外部のクラスやサブクラスからは直接呼び出すことができません。
Privateメソッドは、レシーバを指定せずに呼び出す必要があります。つまり、selfを明示的に使用してはいけません。
これは、クラスの内部実装の詳細を隠蔽し、外部からの不要な干渉を防ぐために使用されます。

## Protected
Protectedメソッドは、同じクラスまたはサブクラスのインスタンスからアクセスできます。
これらは、外部のクラスからは直接アクセスできませんが、同じクラスまたはサブクラス内の他のインスタンスからはアクセス可能です。
Protectedメ

元記事を表示

OTHERカテゴリの最新記事