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

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

Ruby2.7から3.2にアップデートした時につまづいたところ一覧

## 重い腰を上げた
プラットフォームの期限切れも近づいており、そろそろRuby2.7→3.2にあげないといけないタイミングになった。
コケたところを備忘録として残す。

### アップデート内容
“`
ruby ‘2.7.6’ → ‘3.2.2’
rails ‘6.0.3’ → ‘~> 6.1′
“`

# 起きた問題一覧

## Macで Ruby 3.2.2 のダウンロードができない
“`terminal
$ bundle install
rbenv: version `3.2.2’ is not installed
$ rbenv install 3.2.2
BUILD FAILED (macOS 14.4.1 on x86_64 using ruby-build 20240727)
“`

下記の記事を元に3.2.2のインストール完了(感謝)
https://qiita.com/orangeQ/items/117826cdf55806f4209c

## bundle update 時の依存関係エラー
### nio4rエラー
“`terminal
$ bundle

元記事を表示

【Rails】aarch64で環境を立ち上げた時にNokogiriのインストールでエラーが発生した件

どうもこんにちは。

今回は、RailsをAWS Elastic Beanstalk環境へデプロイした時に失敗したので、その時の対処方法を備忘録として残します。

# 発生していたエラー

今回、デプロイに失敗した理由が、「**`nokogiri`** gemが正常にインストールできない」ことでした。

“`ruby
An error occurred while installing nokogiri (1.16.7), and Bundler cannot continue.

In Gemfile:
dropzonejs-rails was resolved to 0.8.5, which depends on
rails was resolved to 7.0.5, which depends on
actioncable was resolved to 7.0.5, which depends on
actionpack was resolved to 7.0.5, which depends on
actionv

元記事を表示

【Rails】Railsチュートリアル第6章 復習用

はじめに

今日もチュートリアルに取り組んでいく。
今回はモデルを主に扱っているようだ

Userモデル

・Railsでは、データモデルとして扱うデフォルトのデータ構造のことを **モデル(Model)** と呼びます
・データベースを使うことで長時間データを保存することができる
・データベースをやりとりするライブラリ(テンプレのようなもの)を **Active Record** という
・ActiveRecordにはデータの作成、保存、検索のメソッドが用意されている
・これらをつかうためにSQLを意識する必要がない!!
・**マイグレーション** = Rubyでデータのはいったテーブル(表)を操作する仕組み

Railsにおける属性

・第4章では`attr_accesor`を用いてUserクラスにnameとemail属性を定義した。
・しかしこれはRubyだから必要なのであって、実はRailsでは属性を定義する必要がない(デフォルトでその仕組が提供されている)

モデル作成

・ここでこれらのユーザー情報を保存するモデルを作成する
・Control

元記事を表示

rails7で、Stimulusを使う

## はじめに
自分用の学習メモです。
Stimulusを使って、クリックすると色が変わるボタンを実装します。

## 実装
bootstrapを使って、ボタンを実装します
“`rb

ボタン

“`
  
Stimulusコントローラを作成します。
“`rb
rails generate stimulus btn
“`
これで、app/javascript/controllers/btn_controller.jsというファイルが作成されます。

“`js
import { Controller } from “@hotwired/stimulus”

// Connects to data-controller=”btn”
export default class extends Controller {
connect() {
console.log(“こんにちは!”)
}
}
“`
  
HTMLにStimulusコントローラを適用するには、データ属性を使用します。di

元記事を表示

PG::UndefinedTable: ERRORの解消方法

# PG::UndefinedTable: ERROR
外部キーの追加を行った際に`PG::UndefinedTable: ERROR`が発生。

# エラー内容
“`
PG::UndefinedTable: ERROR: relation “モデル名” does not exist
“`

`$ rails db:migrate:status`で現在のmigrationファイルを確認
“`
Status Migration ID Migration Name
————————————————–
 down 2024xxxxxxxxx1 Create 子
 down 2024xxxxxxxxx2 Create 親
“`
外部キーを設定している場合、親のモデルからmigrationする必要があるが、デフォルトでは古い順から実行されるためエラーになる。

# 解消方法
以下コマンドで参照元である親モデルを先に実行する。
“`
$ rails db:migrate:up VERSION=202

元記事を表示

RailsのN+1問題におけるpreload, eager_load, includesの挙動の違いと使い分け

## はじめに
N+1問題の対策として以下の3つのメソッドが存在することは知っているものの、挙動の違いや使い分けが思い出せずいちいち調べてしまっています。

– `preload`メソッド
– `eager_load`メソッド
– `includes`メソッド

なんとか記憶に定着させたいのでこの記事を書くことにしました。

3つのメソッドの挙動や使い分けについてまとめます。

なおこの記事におけるRailsのバージョンは**7.1.3.4**です。

## N+1問題とは?
N+1問題とは、データベースからのデータ取得時に発生するパフォーマンス上の問題です。

あるテーブルとそれに関連する別のテーブルのデータを一度に取得する際、クエリが過剰に発行されてしまうことを指します。

RailsにおけるActiveRecordのように、ORMを使用するフレームワークでよく発生します。

## N+1問題の具体例
たとえば、記事の投稿者(`User`)とそれに紐づく記事(`Article`)があるとします。

“`ruby
class User < ApplicationRecord h

元記事を表示

Docker 環境で binding.pry を使ってデバッグする方法

## 初めに
Ruby アプリケーションを Docker コンテナ内でデバッグする際に、`binding.pry` を使いたいと思ったことはありませんか?この記事では、Docker 環境で `binding.pry` を設定する手順を解説します。

## ステップ 1: Gemfile に pry を追加

まず、`Gemfile` に `pry-byebug` を追加します。

“`ruby
gem ‘pry-byebug’
“`

これで、`bundle install` を実行

“`bash
bundle install
“`

## ステップ 2: docker-compose.yml の設定

`docker-compose.yml` ファイルを作成または編集して、デバッグ用の設定を追加します。

“`yaml
docker-compose.yml
web:
build: .
command: bash -c “rm -f tmp/pids~

/////↓この2文を追加
stdin_open: true
tty: true
“`

## ステップ 4

元記事を表示

【Rails】【JavaScript】RailsでJavaScriptを利用する方法について

Rails初学者の学習内容の備忘録です。
間違いや補足等あればご指摘いただけると幸いです。

学習を進めている中で「importmap?webpacker?なにが違うんや…」となったので、今回はRailsでJavaScriptを利用する方法についてまとめました。

# RailsでJavaScriptを利用する主な方法
**1.Sprockets**
・主にRails6以前に利用されていた。
・JavaScriptファイルはapp/assets/javascriptsディレクトリに置かれる。
“`application.js
//= require rails-ujs
//= require_tree
“`

**2.Webpacker**
・Rails6より導入され、JavaScriptをモジュールとして管理するために使われる。
・app/javascript/packsディレクトリにJavaScriptファイルを置かれる。
“`application.js
import Rails from “@rails/ujs”
Rails.start()
“`

**3.imp

元記事を表示

Ruby On Railsと Graph QLで爆速TODOアプリを開発する

## 1. はじめに

GraphQLとRailsを使用してTo-doアプリのAPIを構築する方法を紹介します。GraphQLは柔軟で効率的なAPIを作成するための強力なツールであり、Railsと組み合わせることで、迅速かつ堅牢なアプリケーション開発が可能になります。

## 2. プロジェクトのセットアップ

まず、新しいRailsプロジェクトを作成し、必要な依存関係をインストールします。

“`bash
rails new todo_graphql_api –api -T -d postgresql
cd todo_graphql_api
“`

Gemfileに以下の行を追加します:

“`ruby
gem ‘graphql’
gem ‘graphiql-rails’
“`

そして、依存関係をインストールします:

“`bash
bundle install
“`

GraphQLをセットアップします:

“`bash
rails generate graphql:install
“`

## 3. モデルの作成

To-doアイテムを表すモデルを作成します:

元記事を表示

【Rails】環境構築まとめ

はじめに

現在Railsチュートリアル2周目に取り組み始めて約1週間が経つ
Railsチュートリアル7版ではGitHub CodespacesというクラウドIDE環境での開発が取り上げられている
→テンプレートが用意されていて、環境構築が非常に楽なのだが(というかほぼない)実際に環境構築をする際に何も知らなくて困ってしまう

更に私は来週から技育CAMPのオンラインハッカソンに出場する予定なので、
「さすがに環境構築を知らないのはまずい!」
と思い、環境構築について学習することにする。

もしかしたらチュートリアルのテンプレートは今後開発をする際にも流用できるのかもしれないが、他のエンジニアの方はおそらく環境構築から取り掛かっているだろうし、何かと今後困りそうなので!

基本的にこちらの記事を参考にさせていただいてるが、具体的なインストール手順などは重複してしまうためこちらでは書かない。この記事では必要な部分を要約する形にしたい。

元記事を表示

shakapackerでcssからsassに移行した際にコンパイルに失敗する

## やろうとしていたこと。
Rails7にReactを導入しようとしてまして、その際、shakapackerを用いつつ、sassでスタイルシートを管理するためにセッティングしている最中でした。
.sassにしても.scssにしてもcssに変換がうまくいかず困ってしまったので、備忘録して記載します。

## どんなエラーが出ていたか。
以下のように、`bin/shakapacker-dev-server`を実行後、style-loaderと、sass-loaderのインポート時にエラーが出ていました。
ログ後半では、sass-loaderも利用しているような雰囲気があって、エラーも`Error: expected “{“.`と表示されているなど、名前を変更したapplicatio.sassの中身が悪いのかなと書き方をいろいろ試しているうちに時間を使ってしまいました。

“`bash
app-1 | ERROR in ./app/javascript/packs/application.scss (./app/javascript/packs/application.scs

元記事を表示

【devise】before_action :authenticate_user! が動作しない

## はじめに
deviseの RegistrationsController の editアクションにbefore_action :authenticate_user! を適応したい。

そのまま書いてみるだけではできませんでした。
ちなみに、他のコントローラーでは期待どおりに動作します。

## before_action :authenticate_user! とは
特定のアクションを実行する前にユーザーが認証されているかを確認するためのDeviseのメソッドのこと。
このメソッドを使うと、ユーザーがログインしていない場合はログインページにリダイレクトされます。

下記がうまくいかない。
“`app/controllers/users/registrations_controller.rb
module Users
class RegistrationsController < Devise::RegistrationsController before_action :authenticate_user!, only: [edit] ``` ## 結論 下記の

元記事を表示

Rails7.2の新機能と変更点をまとめる【後編】

Rails7.2がbetaフェーズとなっています。

リリースに先立ち、新機能や変更点などをまとめつつ、実際に検証してみました。

[前編](https://qiita.com/Kazuyaa/items/859568c8f7cbe9a78ddf)も併せてご確認ください。

## トランザクションの最中にActive Jobをキューに渡さない
トランザクションの最中でActive Jobをエンキューした場合に、トランザクションのコミット完了までエンキューが遅延されるようになりました。

トランザクションがロールバックされた場合はジョブを削除します。

トランザクション内でジョブをエンキューしてしまうと、コミットが完了する前にジョブが別プロセスで実行されてしまう可能性があるからです。

例えば以下のコードがある場合、コミット完了前にジョブが実行されてしまうと、実行時点でまだ`user`は存在しないため、エラーが発生します。

“`ruby
ActiveRecord::Base.transaction do
user = User.create!(…)
HogeJob.per

元記事を表示

【Rails】Railsチュートリアル 第5章 復習用

前回の第4章ではRubyのコードに関して学習し、基礎的なオブジェクト指向が理解出来た(はず)

第5章ではおそらくviewの部分をメインに扱っている
さらに今回はBootstrapも用いる

classとid

・HTMLではclassに似たようなidというものがある
・idは重複してはならない(一度しかつかえない)
・クラスとidはcssを当てる時に便利
・また今回のclass名にはbootstrapにおいて特別な意味を持つため、適当につけてはいけない。

“`css
.nav{ /*ここはidの場合は.ではなく#を用いる*/
font-size:20px
}
“`

link_to(重要)

・様々なRailsのコードを見る限り恐らくめちゃくちゃ頻出するコード
・link_toはページ内にリンクを作成するコード(HTMLでいう

元記事を表示

[rails7] bin/devの役割とその仕組み

## 経緯
今回個人開発をする上で、新しく「rails new」 を行い「bin/dev」でローカルサーバーを立てようとした際に、下記のようなエラーが出たため、このエラーを解決するためにbin/devについて調べたのでこれをまとめます。

“`
❯ bin/dev
zsh: no such file or directory: bin/dev
“`

## エラーの原因
railsのbinファイルにdevというファイルがない

## そもそもbin/devとは?
bin/devコマンドは、Rails7においてrails sコマンドの代わりになるコマンドです。これまでrails sを実行していたタイミングで利用します。

なぜrails sではダメなのか?

理由はrails6までデフォルトでwebpackerというgemがありましたが、rails7から廃止になりました。これにより今まで自動的にできていたコードのサイズを小さくし(ミニファイ)、古いブラウザでも動くよう変換し(トランスパイル)、複数ファイルをまとめて一つにし(バンドル)、圧縮するプロセスができなくなってしまいます。

元記事を表示

割り算の余りが出せなくてもエンジニアとしてやっていけますか?

## はじまりはいつも自己紹介から

どうも!
割り算の余りが出せないモンスターです!

今回ですが、rubyで割り算と余りを算出する問題が出され正解を一発で出すことができなかったので、こちらの記事を書く決心をしました。

以下本文

## なんで、できんかったん?

今回の問題を解くのが難しいと感じたのは以下の理由があったからです。

“`
1. rubyの組み込みメソッドが使えない。
2. 割り算の”/”は商しか出すことができないこと。
“`

そのためわかりませんでした。

## 余りを出す組み込みメソッド “modulo”

皆様ご存知かと思われますが、rubyには割り算の余りを出すメソッドがあります。
それがmoduloメソッドです。

### 以下”modulo”の解説

### moduloメソッドの使い方
moduloメソッドは数値オブジェクトに対して呼び出され、引数として除数を指定します。すると、割り算の余りを返してくれます。以下にいくつかの例を示します。

“`
puts 10.modulo(3) # 出力: 1
puts 20.modulo(4)

元記事を表示

【超爆速】DockerでRails環境構築

Ruby on railsをローカル環境で構築して、学習用に手軽に実行したいときにDockerでの構築手順が面倒だと思いました。
Docked Rails CLIを使うと簡単なコマンドを打つだけで実行環境が構築できてしまうのでとても便利だと思いました。
手順を紹介します。
### Docked Rails CLI

[docked](https://github.com/rails/docked#docked-rails-cli)

## 手順
このコードは初心者向けにRailsアプリケーションを簡単にセットアップする方法を示しています。以下に簡潔に解説します:

1. ターミナルで以下のコマンドを実行します:
– Dockerボリュームを作成し、Rubyの依存関係を保存します。
“`shell
docker volume create ruby-bundle-cache
“`
– `docked`というエイリアス(ショートカット)を作成します。これにより、Dockerコンテナ内でRailsコマンドを簡単に実行できます。

元記事を表示

each内でfindしてる処理(線形探索)をハッシュ探索、バイナリ探索にするとどれくらい早いのか計測してみた。

# 前提
以下、過去の開発で実際にあった例です。

“`
stations = [{id: 1, name: station1}, {id: 2, name: station2}, …]
facility_counts_by_station = [{id: 1, count: 10}, {id: 3, count: 20}, …]
idはどちらもstation_idを指す。
“`
のような配列がそれぞれあり、**stationsに同一idのcountをmerge**したい。

これを処理するうえで、**線形探索**、**ハッシュ探索**、**バイナリ探索**それぞれのアルゴリズムで処理速度がどれくらい違うのか比較してみた。

### 補足
ある施設の数を駅ごとに表示するため用意しているデータです。

1つ目の配列はActiveRecordから取得、2つ目の配列はElasticSearchのaggregationから取得しているため、それを突合させる必要がありました。

なお、stationに属するfacilityが0件のケースはfacility_counts_by_stat

元記事を表示

Cloudfront→Nginx→Railsアプリ構成での考慮点について

## 背景
* 私がAWS上で運営している個人サービスはサーバ証明書をAWS Certificate managerから発行しているのですが、このサーバ証明書は、一般的にはロードバランサー(LB)やCloudFrontといったAWSのマネージドサービスと併用する必要があります。[※出所](https://repost.aws/ja/knowledge-center/configure-acm-certificates-ec2)

* LBは個人サービスとしては少しコストが高いため、前段にCloudfrontを置き、オリジンサーバとしてEC2を設定する構成にしています。

本記事は、その構築にあたり考慮すべき点を備忘録として記録するものです。

### End To EndでのHTTP(s)通信の流れまとめ

`ブラウザ (https) → CloudFront:443 → (http) → EC2{ Nginx:80 → (http) → Railsアプリ:3000}`

## 考慮点①:オリジンサーバ(EC)のパブリックIPが判るとCloudfrontを経由せず通信できてしまう問題

元記事を表示

Railsで、グルーピングしたDBレコードを1クエリで取得するscope

# 動機
特定カラムが同じレコードを、そのどれでもいい一つのみを代表して重複を一つにまとめ、レコードと対応するインスタンスとして取得する…というクエリを組むとき苦労したので備忘録です。
当初distinctメソッドを利用してみようとしていましたが、primary_keyが取得できず(selectメソッドにidを組み込むと、idが異なることで重複していないとみなされるため)、レコードと対応するインスタンス化できませんでした。
特定カラムのみをselectしてdistinctすると、idがnil、カラムがまとめた値、という形になります。

distinctの参考:

https://qiita.com/toda-axiaworks/items/ad5a0e2322ac6a2ea0f4

上記記事の`distinctはselectしなくても問題ないか?`のような操作がやりたかったイメージです。

# グルーピングという解決策
以下の記事を参考に、解決に一歩近づくことができました。
`parent_hoge_id`カラムでグルーピングして、グループごとに最大のIDの1レコードを取得していま

元記事を表示

OTHERカテゴリの最新記事