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

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

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

元記事を表示

Optparseの使い方

optparseを使う機会があったので、整理を兼ねて使い方を書いてみます。

Rubyでは沢山のライブラリが用意されており、Gemfileを通して追加することなく使用できるものが沢山用意されています。
その中でも特に使用頻度が高いとされているものは組み込みライブラリと呼ばれ、requireを使って呼び出すことなくそのまま使用することができます。
optparseはコマンドライン上でオプションを受け取る為の呼び出しが必要な標準ライブラリです。
optparseを使う時は以下の3ステップを踏んで進めていきます。

1, `OptionParser`を使ってオブジェクトoptを生成
“`ruby
require ‘optparse’
opt = OptionParser.new
“`

2, オプションを扱うブロックを作成
“`ruby
opt.on(‘-m int’) {|m| month << m.to_i} ``` `on`メソッドで`opt`オブジェクトに登録するオプションを定義する。 `-m`で数値として(intで数値として指定)受け取ったオプションをブロック内で`month

元記事を表示

ルーティングの記述方法

# はじめに
ルーティングの記述方法の理解が曖昧だったため備忘録も兼ねてまとめます。
# ルーティングとは
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

元記事を表示

rbenvを用いたRubyのインストール

# rbenvを用いたRubyのインストール

rbenvを利用してRubyをインストールする手順です。

手順の大まかな流れは以下になります。

1. Homebrewをインストール
2. Homebrewを用いてrbenvをインストール
3. rbenvを用いてRubyをインストール

## Homebrewのインストール

“`bash
brew -v
“`
`zsh: command not found: brew`と表示された場合は、Homebrewをインストールします。
`Homebrew 4.2.0`と表示された場合は、Homebrewはインストールされています。バージョンの数字は環境により異なります。

Homebrewがインストールされていない場合は、以下のコマンドを実行してインストールします。

“`bash
/bin/bash -c “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)”
“`

M1 Macの場合は、次のコマンドも実行して設定を

元記事を表示

忘れやすい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操作を簡単に実装できる。ブログアプリケーションを例に説明しま

元記事を表示

精度の高い計算

精度の高い小数点の計算プログラムを作りました

“`Ruby
# 自分の得意な言語で
# Let’s チャレンジ!!
input_line = gets
array1 = input_line.split(‘ ‘)
M = array1[0].to_f
p1 = array1[1].to_f
q1 = array1[2].to_f
ans1 = (M * p1 / 100).to_f
ans2 = (M – ans1).to_f
ans3 = (ans2 * q1 / 100).to_f
ans4 = (ans2 -ans3).to_f
puts ans4
“`

元記事を表示

どうしても syslog に特定の文字列があったら即時通知したかったので Logstash Output Plugin を自作した

# 概要

SNMP Trap を送信できず、syslog でなら目的のログは送信できるが、緊急性の高い syslog が出た場合、どうしてもなるべくリアルタイムに Slack 通知したい、という稀によくある自体に遭遇したので、ログ収集に使っている Logstash を拡張して、特定の文字列があったら Slack 通知する Output Plugin を自作した。

# 構成の概要

現在、各ネットワーク機器は集約サーバを通すことで SNMP メトリック、syslog を収集している。

![無題のプレゼンテーション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88428/243e8e2e-0b9d-da14-5cb1-0af8738a250d.jpeg)

![無題のプレゼンテーション (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/88428/8fc29fed-11a8-f6a5-2a16-d046

元記事を表示

モジュール結合度をrubyで理解する

# はじめに
(この記事はProgaku Advent Calendar 2023 17日目の記事です。)

こんにちは!
普段は東京都でバックエンドエンジニアをしているおっちーと言います!
最近、業務でコードレビューをする機会が増えてきました。
そこで、今回はコードレビューの観点として含めると有用な「モジュール結合度」について、rubyによるサンプルコードとともに説明させて頂こうと思います!

# モジュール結合度とは
モジュール結合度とは、モジュール間の関連性の強さを示すもので、一般的にソフトウェアの設計において、モジュール間の結合度が可能な限り低いほうが良いとされています。
結合度は、次の7つの種類があります。上から順番に結合度が強いです。

– [内容結合](#内容結合)
– [共通結合](#共通結合)
– [外部結合](#外部結合)
– [制御結合](#制御結合)
– [スタンプ結合](#スタンプ結合)
– [データ結合](#データ結合)
– [メッセージ結合](#メッセージ結合)

**実務でよく見かけるのは、[内容結合](#内容結合)と[共通結合](#共通結合)以外の結合

元記事を表示

Railsのエラー解消

プログラミングはエラー分との戦いです
ただエラー文はHELP(手助け)してくれるものです。
エラーが出てガッカリしず、成長できるものとして捉えましょう!

### 目的
– デバック方法を理解
– 仮説と検証の習慣

webアプリの開発中は、エラーが頻繁に起きます。
エラー解決を重ねることで、Railsの全体像や仕組みの理解が深まります

「No methodError in Tweets#index」
「定義されていないメソッドが呼び出された」というエラーが、
Tweetsコントローラーのindexアクションが実行されたタイミングで
生じたことを表すエラー内容がわかったので、解決の仮説をたて修正し、検証します。
仮説が建てられない場合は、その他の情報を加味しながら仮説をたて、
検証を行うくり返の作業になります

#### デバック
プログラミングの間違い(バグ)を見つけて、手直しすること
#### pry-rails
Gem
デバックツールに属し、作業の際にバグの有無を確認したり、処理を止めてソースコードを正しいかを確認できるものです。
`binding.pry`という記述をソース

元記事を表示

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` の管理が必要であり、これが漏れるとセキュリティリスクに。
– 初期設定が環境変数よりも複雑。

## ど

元記事を表示

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

元記事を表示

`gem install middleman` を実行するとエラー 「ERROR: Failed to build gem native extension.」

# TL;DR

`sudo apt install build-essential` で解決した。

# 環境

* Ubuntu 22.04
* Ruby 3.0.2p107 (Ubuntu 22.04 標準)

# 発生した事象

`sudo gem install middleman` を実行したところ、エラーが発生した。

“`console
$ sudo gem install middleman
Fetching backports-3.24.1.gem
Fetching addressable-2.8.6.gem
Fetching activesupport-7.0.8.gem
Building native extensions. This could take a while…
ERROR: Error installing middleman:
ERROR: Failed to build gem native extension.

current directory: /var/lib/gems/3.0.0/gems/ffi-1.16.3/e

元記事を表示

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

動機

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

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

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

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

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

<

元記事を表示

Rubyのバージョンが勝手に元に戻る現象を解消する

# はじめに

:::note info
本記事は、下記記事内「バージョンが変わらない場合」を実施しても解消されない方向けです。
:::

https://qiita.com/Ficus/items/bdef5c2b504d7a4008fb

# 現状
mac購入時からデフォルトでインストールされているRubyのバージョンを最新版に更新。
しかし、ターミナルを開き直すとバージョンが更新前に戻る。
“`
Last login: Tue Jan 2 00:14:52 on ttys000
% ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin22]
“`

# 目標
ターミナルを開き直しても、更新後のバージョンが認識されること。

# 対象
mac購入後、初めてローカルのRubyを触る方向け。

# 結論
ターミナルがzshの場合、`.zshrc`ファイルをいじる必要があった。
(上記記事ではターミナルがbashだから成功している)

zshとbash?何それ美味しいの?と

元記事を表示

OTHERカテゴリの最新記事