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

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

Railsのキャッシュがいつ切れるかを確認したい

Railsには重いクエリの結果や外部から取得したデータを一時的に保存するために、cache機能が用意されています。
たとえば以下のように記述することで、キャッシュストアの`hoge`キーに値が入っていればキャッシュストアの値を利用し、なければブロック内の処理を実行し、ブロックの返り値をキャッシュストアに保存する処理を行います。

“`ruby
Rails.cache.fetch(‘hoge’, expires_in: 12.hours) do
# 保存したい値が返るように記述する
end
““

## いつキャッシュが切れるか見たい

さて、上記のサンプルコードのように`expires_in`でキャッシュの時間を指定できるというのは有名ですが、今回は逆にキャッシュが切れる時刻を確認したいケースです。

キャッシュが切れる時刻を取得にするためには、以下のコードのように`Rails.cache.read_entry`を利用します。

“`ruby
# キーに値が入ってない場合nilが返るため、expires_atの前に `&`を書いている。
Rails.cache.send(:

元記事を表示

[Ruby] 委譲(def_delegators)を理解する

Rubyには`def_delegators`というメソッド委譲と呼ばれる処理を行うためのクラスメソッドが定義されています。ちなみに、RailsのActiveSupportにも`delegate`という同じようなメソッドがあります。

メソッド委譲を使うと、クラス外で定義されているメソッドを、あたかもインスタンスメソッドのように呼び出すことができるようになります。

“`ruby
class Person
attr_accessor :name
attr_accessor :age
end

class Staff
attr_accessor :person
def_delegators :person, :name, :age
end

p = Person.new
p.name = “Taro”
p.age = 20

s = Staff.new
s.person = p

pp s.name # => Taro
“`

## コードリーディング

まずは、`delegate`メソッドは次のように定義されています。

“`ruby:forward

元記事を表示

【Ruby】case文をハッシュに変えたら少しだけ幸せになれた話

## はじめに
どうもこんにちはもきお([@mokio_50](https://twitter.com/mokio_50))です。今回は実務で「おっ、これいいじゃん」と思ったちょっとしたリファクタリングになります。

例として今回は東海オンエアのメンバーからメンバーカラーを返すと言うのを例にしました。

## if文をcase文に

一番条件分岐でオーソドックスなif文で書くと

“`ruby:
member = “ゆめまる”

if member == “てつや”
“オレンジ”
elsif member == “りょう”
“ブルー”
elsif member == “しばゆー”
“イエロー”
elsif member == “ゆめまる”
“ピンク”
elsif member == “虫眼鏡”
“ブラウン”
elsif member == “としみつ”
“グリーン”
end
“`
今回は`ゆめまる`なので`ピンク`が表示されるでしょう。

続いてcase文を用いて書くと

“`ruby:
member = “ゆめまる”

case member
when

元記事を表示

診断機能(ポイント制)

Ruby on Rails でポイント制の診断機能を実装する。
おすすめのキャラクターの診断ができる機能を実装する。

## 開発環境
– Ruby3.0.6

## 診断設計
Question1からQuestion3に対して「はい」→キャプテンアメリカに+1
Question4からQuestion6に対して「はい」→アイアンマンに+1
Question7からQuestion9に対して「はい」→スパイダーマンに+1
Question10からQuestion12に対して「はい」→ソーに+1
計12問の「はい/いいえ」の質問に回答すると、「はい」の数が最も多いキャラクターが表示される。

## 手順
1. モデル
2. ルーティング
3. コントローラー
4. ビュー

## 1. モデル
question1からquestion12の計12個(データ型がinteger)のカラムを持つTestモデルを作成する。
“`cmd
rails g model Test question1:integer question2:integer …
“`

“`cmd
rails db:migr

元記事を表示

Dockerを使ったrails apiモードの環境構築

## はじめに
Dockerを使ってrails apiモードの環境構築を行います。

## 環境
`ruby 3.2.2`
`rails 6.1.0`

## 作業ディレクトリ作成
はじめに作業ディレクトリを作成して`Dockerfile`と`docker-compose.yml`を作成します。

“`terminal
mkdier app
“`

railsコンテナはAPIとして運用するのでapi、データベースのコンテナ名はdbとしました。

“`docker-compose.yml
version: ‘3’
services:
db:
api:
“`

## rubyインストール
いきなりrailsをインストールするのではなくapiコンテナにrubyをインストールします。

“`Dockerfile:Dockerfile
FROM ruby:3.2.2

RUN apt-get update -qq && apt-get install -y vim

WORKDIR /app
“`

docker-composeも編集しましょう。

“`docker-com

元記事を表示

Rails7 で TODOアプリを作ろう ⑨ (Enumや日時のバリデーション)

## はじめに

### 前回は

#### バリデーションメッセージのテンプレート化 として

https://qiita.com/tomoaki-kimura/items/57eb705ceeb228161fe6

– コンソール
– バリデーション
– errors
– バリデーションメッセージ

について学びました。

### 今回は

#### Enumや日時のバリデーション として

– Enumのバリデーション
– カスタムバリデーション
– 日時のバリデーション
– タイムゾーン

について学びます。

では、はじめていきましょう。

## 1. バリデーションヘルパー

### ヘルパー一覧

バリデーションに関しては、かなりの項目数になるので、一度Railsガイドに目を通してみると良いでしょう。

https://railsguides.jp/active_record_validations.html

今回は、Rails7以降で追加された便利なバリデーションを含めてやっていきましょう。

## 2. Enumのバリデーション

### validate: tru

元記事を表示

rubocop custom copの作成

## 背景
`Time.zone.now`を`Time.current`に変更したため、ついにルールとしてRuboCopに追加しました。

## 環境
“`
❯ ./bin/rails –version
Rails 7.1.1

❯ bundle exec rubocop –version
1.57.2
“`

## Custom Copを追加
– lib/custom_cops/ban_time_zone_now.rb

### install parser ([AST用](https://docs.rubocop.org/rubocop/development.html#basics))
“`
❯ gem install parser
Fetching ast-2.4.2.gem
Fetching parser-3.2.2.4.gem
Successfully installed ast-2.4.2
Successfully installed parser-3.2.2.4
Parsing documentation for ast-2.4.2
Installing ri

元記事を表示

Rails – Rspec の request のテストでファイルをアップロードする例

# コード例

“`rb
require ‘rails_helper’

describe ‘post /example/’, type: :request do
subject { post ‘/example/’, params: }

let(:params) do
{
file: fixture_file_upload(‘path/to/file’)
}
end

it do
subject
expect(response).to have_http_status(:ok)
end
end

“`

# チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

# Twitter

元記事を表示

【MySQL,Rails】アプリケーションの動作を改善したい(INDEX)

どうもこんにちは。

今回はRailsでデータベースにインデックスを貼る方法をまとめます。

# インデックスとは

インデックスは、データベース内のデータを迅速に検索するための構造です。データベースにおいて、特定の列(フィールド)に対してインデックスを作成することで、その列を使った検索やソートが高速になります。

# インデックスの構造

## データのポインター

インデックスは、実際のデータの場所を指し示すポインターの集まりです。これにより、データベースは全ての行を調べるのではなく、必要なデータを迅速に見つけることができます。

## 構造

多くのデータベースシステムでは、インデックスはB-Treeという特殊な木構造で作成されます。これにより、大量のデータの中からも効率的に検索が可能になります。

# インデックスの利点と欠点

## 利点

### 高速な検索

インデックスがあると、データベースは特定の値を持つ行を迅速に見つけることができます。
効率的なソートと集計: インデックスされた列を使ってデータをソートや集計する操作が高速になります。

## 欠点

### 追加の

元記事を表示

ルーティングは設定順も重要!!

## 設定順を意識しないとどうなったか?
「id」を含むルーティングを指定した後、「id」を含まないルーティングに合わせてURLを入力しアクセスしたが、本来と違うアクションが動いてしまい、違うViewページを表示してしまった。

## ルーティングの設定順ミスによる事例
今回はProgateのRailsコースを例に、ルーティングの設定順を意識せずに指定するとどうなるかの事例を挙げてみました。

“`routes.rb
Rails.application.routes.draw do
get “signup” => “users#new”
get “login” => “users#login_form”
post “login” => “users#login”
post “logout” => “users#logout”

get “users/:id” => “users#show” ## idを含むルーティング
get “users/:id/edit” => “users#edit” ## idを含むルーティング
post “users/:i

元記事を表示

[初学者] sorceryでユーザー登録、ログイン・ログアウト機能の作成

### 目的
学んだことを忘れないように備忘録として残す
### sorceryとは?
SorceryはRuby on Railsで使用できる認証および認可のGem。これを使用することで、ユーザー認証、パスワードリセット、ユーザー管理などの一般的な認証および認可機能をアプリケーションに簡単に統合できる。
### gemとは?
gem は、Rubyプログラミング言語の拡張機能やライブラリをパッケージ化したもの。
RubyGemsを使用することで、他の開発者が書いたRubyライブラリやアプリケーションを簡単にインストールできる。
# sorceryの追加
gemファイルにsorceryを追加
“`ruby
gem ‘sorcery’
“`
### gemの反映
bundle installで追加したgemファイルを反映
“`ruby
bundle install
“`
# sorceryのセットアップ
### Sorcery gem用の設定ファイルと関連するファイルを生成
必要なファイルをプロジェクトに追加し、設定をカスタマイズできるようにする。
“`ruby
rails g s

元記事を表示

factory_bot_rails を 6.4.0 にしたら Rails アプリが起動しなくなった

Rails 7.0.8 で開発中のウェブアプリで,factory_bot_rails のバージョンを 6.2.0 から 6.4.0 に上げたら Rails サーバーも Rails コンソールも動かなくなった。

`rails console` とやると以下のようなエラーが出て落ちる。

“`
(略)/railties-7.0.8/lib/rails.rb:47:in `configuration’: undefined method `config’ for nil:NilClass (NoMethodError)

application.config
“`

そのプロジェクトでは Gemfile で factory_bot_rails のバージョンをガチガチに固定してはおらず,当初は,factory_bot_rails のバージョンが変わったことが引き金になっているとは分からなかった。

認証系 gem の [sorcery](https://rubygems.org/gems/sorcery) を使っていたが,いろいろ試しているうち,Gemfile から sorc

元記事を表示

初めてGitHub Actionsを使ってRailsのRSpecを自動化したときの備忘録

GitHub Actionsでpushをトリガーにrailsのrspecを起動させるコードを初めて作成したときの記録です。色々エラーが発生したので、メモしました。

## GitHub Actionsコード
“`
name: Run RSpec

on:
push:

jobs:
rspec:
name: RSpec Tests
runs-on: ubuntu-latest

services:
mysql:
image: mysql:8.0.31
ports:
– 3306:3306
env:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
options: –health-cmd “mysqladmin ping” –health-interval 10s –health-timeout 5s –health-retries 10

steps:
– name: Checkout code

元記事を表示

Ruby on Railsアップデート(Action Mailer/Active Storageの修正 他 2023-11-17)

## 引用元
https://world.hey.com/this.week.in.rails/action-mailer-bug-report-template-active-storage-fixes-and-more-6264430d

## 今週のトピック

### [word_wrapが空文字列を返すように修正](https://github.com/rails/rails/pull/50069)
[word_wrap](https://railsdoc.com/page/word_wrap)(指定された長さ以降の空白に改行を入れて出力するメソッド)が空の文字列を与えられたときに、nilの代わりに空の文字列を返すように修正された。

### [プレビュー処理時にバリアントを処理する](https://github.com/rails/rails/pull/50044)
[ActiveStorage::Preview#processed](https://api.rubyonrails.org/v7.0.8/classes/ActiveStorage/Preview.html)

元記事を表示

Rails – トランザクションをネストするとロールバックが効かない

# 例

内側でロールバックを実行してもコミットされてしまうようだ

“`rb
p Example.count

ApplicationRecord.transaction do
ApplicationRecord.transaction do
Example.create
end

raise ActiveRecord::Rollback
end

p Example.count # カウントが増えてしまう
“`

単純なコードであれば気づくが、コードが入り組んでいる場合は注意

# 外側の制御で回避

外側のトランザクションで `joinable: false` を指定すると、外側のトランザクションへの合流を防げるようだ

“`rb
p Example.count

ApplicationRecord.transaction(joinable: false) do
ApplicationRecord.transaction do

Example.create

raise ActiveRecord::Rollback
end
end

元記事を表示

Railsコールバックのchanged?って?

## きっかけ
「order_idが変わったらorder_statusの値を変更する」という実装でコールバックを使用した際に、
コールバックの挙動を理解できておらず躓いてしまったのでアウトプットとしてまとめてみました。

## ケース1
コールバック発火しない
“`ruby:order.rb
enum status: {
unchecked: 0,
checked: 1,
error: 3
}

after_update :order_status_reset, if: -> { order_id_changed? }

def order_status_reset
self.unchecked!
end
“`
### 原因
after_updateではorder_id_changed?に該当しない。

after_saveも同様だが、changed?は
現在の値と変更しようとしている値を検証するもの。

そのため、updateやsaveした後は
すでに変更しようとした値は保存されており、
changed?は発火しない

元記事を表示

忘れないようにRailsのDB編集2

### すべてChatGPTより

`add_column` メソッドでカラムに `int` を指定する場合、`integer` データ型を使用します。これは通常、一般的な整数を表現するためのデータ型です。

具体的には、以下のように `add_column` を使って `integer` データ型を指定します。

“`ruby
class AddTaskToArchives < ActiveRecord::Migration[7.0] def change add_column :archives, :task_id, :integer, null: false add_foreign_key :archives, :tasks, column: :task_id end end ``` このコードでは、`:archives` テーブルに `:task_id` という名前の `integer` データ型のカラムを追加しています。そして、`add_foreign_key` メソッドを使用して `:archives` テーブルの `:task_id` カラムを

元記事を表示

[Rails] routes.rbのresource, resourcesの違い

# 目的
現在携わっているRails のプロジェクトのroutes.rbで、名前が似ているresourceメソッド,resourcesメソッドが使用されていたので、その意味、違いについてまとめる。

# resources
7つのアクション(index、show、new、create、edit、update、destroy)のルーティングを一括生成してくれるメソッド
例)
routes.rbに
“`routes.rb
Rails.application.routes.draw do
resources :users
end
“`
と書くと,
“`
$ rails routes
users GET    /users(.:format)    users#index
POST   /users(.:format)  users#create
new_user GET    /users/new(.:format)    users#new
edit_user GET    /users/:id/edit(

元記事を表示

ローカル環境でrails newする際に -d postgresql オプションでエラーが出る際の対処法 & PostgreSQLのインストール【Rails 7, Mac OS】

:::note warn
PostgreSQLがインストールされていないために発生するエラー対処の記事となります。PostgreSQLの使い方の記事ではありませんので、ご了承くださいませ。
:::

## はじめに
Railsのハンズオンや環境構築資料でよく見かける以下の rails new コマンド。
“`zsh
$ rails new test_app -d postgresql

# –database=postgresql と読み替えていただいて問題ありません。
“`

データベースオプションである、`-d postgresql` を指定することで、Railsと同時にPostgreSQLのセットアップをすることができます。※デフォルトはsqlite3が指定される。

しかし、ローカル環境にPostgreSQL自体をインストールしていない場合、pg gem(PostgreSQLのRubyライブラリ)のインストール中にエラーが発生する可能性がありますので、以下備忘録として、手順を残したいと思い記事にしてみました。

※ 現在プログラミングスクールに通っております。カリキュラム

元記事を表示

【Ruby on rails】Aws::S3::Errors::RequestTimeTooSkewed

# はじめに
プログラミングを勉強して3か月ほどです。
プログラミングスクールを卒業し、現在就職活動をしています。

今回はオリジナルアプリにS3を導入した際に発生したエラーの対処法を共有したいと思います。
下記の記事を参考にさせていただきました。

https://zenn.dev/karaage0703/articles/47838858dd3107

# 今回のエラー内容
今回のエラーはS3導入後に画像を保存しようとした際に発生しました。
エラーの内容は、リクエストを行うクライアントとリクエストを受信するサーバーとの間の時間のズレに問題があることを示します。
[![Image from Gyazo](https://i.gyazo.com/31f3193a16ea29a8075139fadf75fe4a.png)](https://gyazo.com/31f3193a16ea29a8075139fadf75fe4a)
このエラー原因としては大きく2つ挙げられます。
1つ目は、AWS側の地域設定に誤りがあり、時刻がズレてしまっている。
2つ目は、システムの時間が合っていない。
今回

元記事を表示

OTHERカテゴリの最新記事