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

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

Railsで画像を保存する際のassets配下とpublic配下の違い

# Railsで画像を保存する際のassets配下とpublic配下の違い

Railsアプリケーションにおけるアセット管理は、画像、スタイルシート、JavaScriptなどの静的ファイルを効率的に扱うための重要な部分です。特に画像ファイルの配置には、`assets`ディレクトリと`public`ディレクトリの2つの主要な選択肢があります。これらの違いを理解することは、Rails開発において重要です。この記事では、`assets`ディレクトリと`public`ディレクトリの特徴と使い分けについて詳しく解説します。

## assets配下に画像を保存する

### assetsディレクトリの役割

#### 概要

`assets`ディレクトリは、Railsアセットパイプラインの一部として機能します。アセットパイプラインは、JavaScriptファイル、スタイルシート、画像などのアセットを効率的に管理し、配信するための仕組みです。

#### 特徴

– **プリコンパイル**: `assets`ディレクトリに置かれた画像は、本番環境へのデプロイ時にプリコンパイルされます。これにより、

元記事を表示

VSCodeでRailsのCtrl+Clickで参照元にいけない

# はじめに

仕事でRailsを最近書いているのですが、そこでこまったことをまとめておきます

# 問題

Railsを使っている上でモデルのメソッドなどにとびたいときがあります
そのときに**Ctrl + Click**で以前は参照元に飛んでいたのですが、いま拡張機能をいれてもその機能が使えませんでした

# 解決方法

最新のRubyの拡張はその機能が使えなくなっているそうです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/4f6c2308-89ce-e438-c6bd-2ca324f8e55d.png)

少し前の**非推奨**のバージョンであれば利用できるのでそちらをインストールしました

**Ctrl + p**でコマンド`ext install rebornix.Ruby`を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/8fca6fc0-

元記事を表示

Railsのバリデーション – presence / allow_nil / allow_blank の違い・役割の整理

# presence

値が空の場合にバリデーションエラーを起こす。

> presence
> このヘルパーは、指定された属性が空(empty)でないことを確認します。値がnilや空文字でない、つまり空でもなければホワイトスペースでもないことを確認するために、内部でObject#blank?メソッドを使っています。

例:

“`rb
validates :foo_column, presence: true,
“`

# allow_nil

値がnilの場合にバリデーションをスキップする。

例:

“`rb
validates :foo_column, format: { with: /REGEXP/ }, allow_nil: true
“`

あくまで役割は「バリデーションのスキップ」なので、これを指定したからと言って値にNULLを許可するわけではない。
バリデーションを何も書かなければ、RailsのバリデーションとしてNULLは最初から許容される。

つまり何もバリデーションを指定せずに `allow_nil: true` を指定しても意味がない。
(エラーが発

元記事を表示

Rails – マイグレーションで既に作成済みのカラムのNULL制約をつける・外す時は change_column_null

# NULL制約を付ける場合

“`rb
class ExampleMigration < ActiveRecord::Migration[7.1] def change change_column_null :examples, :foo_column, true end end ``` # NULL制約を外す場合 ```rb class ExampleMigration < ActiveRecord::Migration[7.1] def change change_column_null :examples, :foo_column, false end end ``` # 注意 change_column だと null 制約以外も色々と書かないといけないのでよろしくなさそう ```rb change_column :examples, :foo_column, :string, :null => :false
“`

# Railsガイド

Railsのマイグレーションは色々な種類があって何が推奨かのか分からなくなりがちだが、Ra

元記事を表示

【PostgreSQL】テスト環境でのシーケンスの自動採番がリセットされない

## 発生した現象

RSpecでテスト実行後、普通はデータベースはリセットされてPKが1から採番されると思いますが、
何故かリセットされずテスト実行の度にPKがインクリメントしていくという現象が起きていました。

—-

**[例]**
– 1回目のテストを実行し、Userのテストデータを5人分作成したらusersテーブルのidが1〜5まで生成される。
– 1回目を終え、2回目のテストを実行するとusersテーブルのidが6〜10が生成される。レコード自体は残っていない。

—-
といった感じです。

別にバグやエラーというわけではないですが、気持ち悪かったので解消しようと思い
一応解決したので備忘録として残します。

## 環境
– Ruby 3.2.2
– Ruby on Rails 7.1.1
– PostgreSQL 15.3

docker composeで環境構築しています。

## 原因

結論、特定はできませんでした。
(わかる方いらっしゃればコメントいただけますと幸いです)

調べていてよく出てきたのは
「rails_helper.rbの`config.u

元記事を表示

Sporockets::FileNotFoundのエラー解決方法

# Sporockets::FileNotFoundのエラー解決方法

Ruby on railsでアプリを作成中にエラーが出てきたので
原因と対処法を書いていきます。

## なぜエラーが出たのか?
gemを導入してターミナルで
`bundle install`
を実行した後に
localhost:3000/
でブラウザを開こうとしたらエラーが出ました。

## 対処法

ターミナルで
Ctrl+CでRailsサーバーを切り、再度`rails s`を実行する。

gemをインストールした後は
サーバーの再起動を徹底します!

元記事を表示

誤字監視システムをつくってみた (wordrabbit API)

おはようございます。[wordrabbit](https://wordrabbit.jp)の福澤です。各週水曜日に技術ブログを投稿していきます。今週もよろしくお願いします。

![wordrabbit_developmers.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72371/9450923a-dcfd-8878-4c13-0cb0581812ea.jpeg)

さて今日は、文章校正サービスである[wordrabbit](https://wordrabbit.jp)の非公開APIを使って、ウェブサイト全体の誤字を監視するシステムを作ってみたいと思います。

皆さん、多かれ少なかれ、ブログ記事やLP、サービスを公開したり修正したりした後に、誤字が見つかるという経験をしたことがあるのではないでしょうか?公開した直後ならまだよいのですが、公開数年を経て発見される誤字もあります。特に大きなサービスになると、この誤字を何年も放置してしまっていたのか……と冷や汗ものです。

そんなことを防げるサービスをつく

元記事を表示

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

元記事を表示

OTHERカテゴリの最新記事