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

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

【個人開発】北海道の魅力を発見し、北海道旅行のお悩みを解決するアプリを作りました🐄

# はじめに
はじめまして、はる([@lemonade_37](https://twitter.com/lemonade_37))と申します。
完全異業種からエンジニアに転職するためオンラインスクールに入り学習をしていました。

オンラインスクールでは北海道から受講している方がほとんどおらず、
道外の方と交流する中で、

道外の方は意外と北海道について知らないことが多いのかも🤔
道民が近くにいなくても、代わりに相談に乗ってくれるようなアプリを作りたい💭
もっと北海道を身近に感じてもらいたい🦌
と思ったことがきっかけで、このアプリを作成しました。
  
**「えぞとらべる」**

https://ezo-travel.com/

https://github.com/satou-haruka-37/hokkaido_travel

# 使い方
### 1.北海道内のおすすめのスポットを探す機能
道外の方からの **「田舎の方に行くと観光情報が見つけにくかった」** というお悩みに対して、
おすすめスポットはユーザー投稿型にして、田舎にある素敵なスポットも、有名なスポットも、平等に表示され

元記事を表示

【Ruby on Rails】rubocopの警告「Rails/InverseOf」から学ぶinverse_ofオプション

私は現在、未経験からのエンジニア転職に向けてプログラミングスクールで学習をしている、いしかわと申します。

個人開発中に`rubocop`から`Rails/InverseOf`と警告されたことをきっかけに`Active Record`の`inverse_ofオプション`を用いた`双方向関連付け`について学習した内容をアウトプットとしてこちらの記事にしました。
どなたかの参考になれば幸いです。

:::note warn
プログラミング初学者なので、内容に誤り等ある可能性があります
誤りがありましたら教えてくださると幸いです
:::

環境
ruby 3.2.2
Ruby on Rails 7.0.8

# 双方向関連付けとは
皆さんが良く知る以下のアソシエーション関連付けは`双方向関連付け`と呼ぶことができます
※まずこれすら知らずにアソシエーションだなんだかんだと言っていた私に石を投げてください
“`ruby
class User < ApplicationRecord has_many :books end class Book < ApplicationRecord

元記事を表示

オーバライドとモンキーパッチでどう違うねんと思ったので調べた

オーバーライド(Override)とモンキーパッチ(Monkey Patch)は、どちらも既存のコードの挙動を変更する方法ですか、
使用される文脈と目的において全く違う振る舞いをするよと教えてもらったのでまとめてみました。

### オーバーライド

オーバーライドは、主に継承で使用され、
サブクラスがスーパークラスで定義されたメソッドを再定義することを指します。

#### 具体例
“`ruby
class Animal
def speak
“Some sound”
end
end

class Dog < Animal def speak "Bark" end end dog = Dog.new puts dog.speak # 出力: "Bark" ``` この例では、`Dog`クラスが`Animal`クラスの`speak`メソッドをオーバーライドしています。 ### モンキーパッチ モンキーパッチは、既存のクラスやモジュールに新しいメソッドを追加したり、既存のメソッドを変更したりするために使われます。モンキーパッチは、継承とは関係なく

元記事を表示

Ruby on RailsのDEPRECATION WARNINGの出力先を設定するactive_support.deprecation

Railsをバージョンアップするときに、`DEPRECATION WARNING`が出ることがあります。
この警告は「今回のバージョンアップでは影響がないが将来的に無効になる機能」を教えてくれます。

## `DEPRECATION WARNING` の例

例えば Rails 7.1 にバージョンを上げたときに、次の警告が表示されることがあります。

“`sh
DEPRECATION WARNING: Passing the coder as positional argument is deprecated and will be removed in Rails 7.2.

Please pass the coder as a keyword argument:

serialize :namespaces, coder: Psych
(called from at /home/runner/work/pubannotation/pubannotation/app/models/project.rb:6)
“`

現在は次のように、Ac

元記事を表示

rails7×docker環境下でrails dbconsoleが立ち上がらない時の解決方法

# 概要
タイトル通りではあるが、軽くアプリを作っていたときに`rails dbconsole`が立ち上がらなくなった

# エラー内容

コンテナ内で実行
“`bash
# rails dbconsole
DEPRECATION WARNING: The config.web_console.whitelisted_ips is deprecated and will be ignored in future release of web_console. Please use config.web_console.allowed_ips instead. (called from

at /bauikis2/config/environment.rb:5)
Couldn’t find database client: mysql, mysql5. Check your $PATH and try again.
“`

1. `Couldn’t find database client: mysql, mysql5. Check your $PATH and try

元記事を表示

Rails・クラウド初学者が初めてGoogle App Engine(GAE)スタンダード環境にRails7+MySQLアプリをデプロイするまでの顛末

初投稿です。Rails で本格的なWebアプリを作れるようになろうと独学中です。

アイデアが一定程度Railsアプリ(Rails7+MySQL)の形になってきたのでいざ動かさん、と
構築が簡単なようで費用負担も許容範囲に収まりそうな Google App Engine のスタンダード環境であれやこれや調べながら試行錯誤したのですが、
動くようになるまでかなり苦労した――元々インフラ周りが特に苦手なのが大きいですが――ので顛末を書き残しておきます。

## ローカル環境
ローカル環境はWindows 10 Pro、Ruby3.2.2、Rails7.1.2。
Docker 等の仮想環境や rbenv[^1] 等のバージョン切替などは特に入れていません。

## 基本手順

概ね公式ドキュメントや下記参考記事に則ったものなので詳細は割愛します。
その通りやっただけでは解決しなかった問題とその対処を次章以降で詳細に記します。
※Cloud SDK はインストール・セットアップ済前提

参考記事

https://mintaku-blog.net/gae-rails/

https://min

元記事を表示

【Docker】Can’t connect to MySQL server on ‘db’ (115)

# エラー内容
Can’t connect to MySQL server on ‘db’と表示され
dbコンテナが完全に起動する前にbackendコンテナが動作している。

“`cli:
user@usernoMacBook-Air backend% docker-compose up
[+] Running 3/2
✔ Network backend_default Created 0.0s
✔ Container db Created

元記事を表示

insert_all について

## insert_all とは
複数のレコードを登録(bulk insert)できる
データベースアクセスが多くなりがちなループ処理などで有効
ただし、バリデーションなどのチェックを無視して登録する点に注意

## 使用例
“`
user_names.each { |user_name| User.create(name: user_name) }

→上記ではuser_namesの数が増えれば増えるほどDBアクセスが多くなる
ただし、正常にバリデーションが各insertに行われる

user_attributes = user_names.map { |user_name| {name: user_name} }
User.insert_all(user_attributes)

→上記では、一括でDB登録が行える
ただし、前述の通りバリデーションなどを無視し、またinsertに失敗した要素があったとしても例外は発生させない
“`

## 使い分け
insert対象が多くなりそうな場合は、insert_allが良さそう
ただ、エラーハンドリングやトランザクションは

元記事を表示

find_or_create_by について

## find_or_create_by とは
ActiveRecordが用意しているメソッド
存在チェックをしながら、登録ができる
また、該当のレコードが見つかった場合は、該当のレコードが戻り値として返ってくる

“`
user = User.find_or_create_by!(name: “Alice”)
→nameカラムがAliceのレコードを検索し、該当するものがなかった場合登録をする
“`

## find_or_create_by と find_or_create_by! の違い
find_or_create_by は登録ができなかった場合はnilを返し、例外は発生しない
find_or_create_by! は登録ができなかった場合は、例外を発生させる

元記事を表示

Rails アプリに E2E テストを導入する(技術選定編)

E2E テストを導入するにあたり、技術選定で調べたことをまとめてみました

## とりうる選択肢とそれぞれの特徴

1. System Spec 経由で Capybara を使い Selenium をドライバーとして動かす
– System Spec 自体が RSpec に組み込まれており、かつ Selenium が Capybara のメジャーなドライバーなので rails で E2E テストをする場合の標準的なテストスタックと言える。rspec と統一された設定、環境で E2E テストが行える
1. System Spec 経由で Capybara を使い Playwright をドライバーとして動かす
– Selenium をドライバーとして使った場合、テストが正常に実行されない場合があるので、その点を解消したい場合はこちら。Rails 7.1 であれば Playwright 用の設定が組み込まれているので gem をインストールすればそのまま使えるが、Rails 7.0 以前でも設定を追加すれば使える
1. Capybara を直接動かす
– 詳細な設定や S

元記事を表示

Railsガイド +αメモず【MVC周り】

# はじめに
素人の戯言なんですが、
「フィルタ」と聞くと`Array.filter`しか思いつかないんですよね。
(つまり、集合からの抽出)

Rails MVCのコントローラの文脈で「フィルタ」が出てきたので
「それはなんぞや」ということで調べました。

ついでに、MVCモデル周りでわからなかったことをまとめてます。
いつも通り書き捨ての文です。よろしくお願いします。

# メモず
## コントローラ
### フィルタって?
コントローラのアクション前後に特定のメソッドを実行する機能のようです。
viewにおける`application.html.erb`ですね。
**この「特定のメソッド・共通の処理」を「フィルタメソッド」と呼ぶらしいです。**
(Rails独特の言い回し)

具体的には、以下の3つが当てはまります。
> 1. **before_action(または before_filter)**:
>
> – アクションが実行される前に呼び出されます。
> – 認証チェック、パラメータの検証、セッションの確認などに使用されます。
> 2. **aft

元記事を表示

each などのarrayメソッド時の、break, return, nextの挙動

## break
ループを抜ける

“`
users.each | user | do
puts user
break if user == ‘hoge太郎’
end
 →userが「hoge太郎」の時、ループを終了しeach処理を抜ける
“`

# return
メソッドを抜ける

“`
class hogehoge
def puts_name(users)
users.each | user | do
puts user
return if user == ‘hoge太郎’
end
end
 →userが「hoge太郎」の時、hogehogeメソッドを抜ける
“`

# next
ループの次の要素に行く

“`
users.each | user | do
puts user
next if user == ‘hoge太郎’
puts ‘hoge太郎のときは出力されないよ’
end
 →userが「hoge太郎」の時、次の要素に即座に行く、後続の処理(ここで言う、puts)は実行されない
“`

元記事を表示

ActiveRecord scopeについて

## scope とは
クエリを定義できるもの
よく使うものであったり、変数的に命名したいものを定義できる
引数を渡すこともできる

## 例
“`
class Post < ApplicationRecord scope :published, -> { where(published: true) }
scope :recent, ->(days_ago = 7) { where(“created_at >= ?”, Time.now – days_ago.days) }
end
“`

## クラスメソッドとの使い分け
条件分岐など、ロジックが複雑になりそうなものに関しては、クラスメソッドを定義する

“`
class Post < ApplicationRecord def self.recent(days_ago = 7) where("created_at >= ?”, Time.now – days_ago.days)
end
end
“`

元記事を表示

preload, eager_load, include の違い

## preload, eager_load, includeとは
N+1を解消する、ActiveRecordのメソッド

## 前提
下記、違いについての説明は、この2モデルが存在すると仮定する
usersモデル、postsモデルの2テーブルある
postsモデルはusersモデルに紐づいている

## preload
二つのクエリを発行し、関連するモデルを取得する
クエリをモデルごとに発行するため、where旬の条件としては使えない
JOINをするわけではないので、条件を指定しないのであれば、比較的軽量

“`
users = users.all.preload(:posts)

上記は、usersに対してのall、usersに紐づくpostsの取得、この二つのクエリを発行している
“`

## eager_load
関連するモデルに対して、LEFT OUTER JOINする
JOINするため、条件として使用可能
大規模なテーブルになった場合、JOINする数が多くなり、複雑になり、パフォーマンスに影響する可能性あり

“`
users = users.all.eager_lo

元記事を表示

【Rails】carrierwaveでローカルに保存したファイルをアクションを経由して取得する

## はじめに
carrierwaveでpdfファイルを投稿し、そのファイルをクリックするとファイルを開く機能があります。
今回は、ファイルをローカル上のpublicディレクトリに保存しているためurl直打ちでファイル表示がされる対策のために、保存先をpublicディレクトリから変更し、ファイルのパスから直接取得するのではなくアクション経由で取得する方法に変更してurl直打ちで表示するのを防ぐ対応をしました。
carrierwaveでのファイルの投稿機能などについては今回のテーマの趣旨とは違うため省略します。

## 環境
`Rails 7.0.4`

## テーブル
| Posts |
|:———–|
| name |
| file |

## コントローラー
~~~ruby:app/controllers/posts_controller.rb
def show_file
file_path = Rails.root.join(‘uploads’, ‘post’, ‘file’, params[:id], “#{params[:file_

元記事を表示

Railsにおける複数形`s`の注意

# はじめに
めちゃくちゃつまづいた理由が「複数形`s`」にあったので、
戒めと教訓の思いを込めて、「複数形に気を付けようね!」という記事です。
# 問題
`routes.rb`にて、`resource :login …`と書くべきところを、
`resources :login …`と書いてしまい
`id`必要だわ`spec`は通らないわ、
GPTに聞いても「`login`を`logins`と書いてください」と解決にならない解決策(私が悪い)。
大変でした。
# 気を付けるべきところ
## `resource`と`resources`は別物
> ### `resources`
>
> – `resources`は、複数のリソースを扱う際に使用されます。一般的には、複数のオブジェクトの集合に対するCRUD(Create, Read, Update, Delete)操作を行う場合に使います。
> – 例えば、`resources :users`と記述すると、ユーザーの一覧表示(index)、新規作成(new)、表示(show)、編集(edit)、更新(update)、作成(cre

元記事を表示

データを取得するために、何気なく使用していた、findメソッド・whereメソッドそれぞれから得られる結果の違いについて

## バージョン
– ruby 3.2.2
– Rails 6.1.7.6
————————-

データを取得するために、深く考えずに使用していたfindメソッドとwhereメソッド。だが、スクールで課題に取り掛かっていた時に、得られる結果に奥深い違いがあることを知り、追求したくなったので、とりあえず現時点でわかったことをまとめたいと思います。

今回、tasksテーブルが以下のように定義されている。
|name|content|created_at|updated_at|以下、関係ないので省略…|
|:-:|:-:|:-:|:-:|:-:|

## あるタスクの内容(content)のデータを取得しようとwhereを使ったら、エラーになった!!なぜだ!!

`task.content` という形で、あるタスクの内容のデータを取り出すために、まず、
`task = Task.find(39)`として、idが39のデータを取り出そうとしたが、この日の私は、最近findばかり使用しているから、whereにも慣れたいなと考え、whereを用いてデータを取得

元記事を表示

Stimulus アプリケーションの起動時に何をしているのか?

# はじめに

私は、StimulusをRailsで使うとき、[stimulus-rails](https://github.com/hotwired/stimulus-rails) gemをインストールします。
そして、以下のコマンドを実行してStimulusを使う環境を整えます。
“`sh
./bin/rails stimulus:install
“`
このコマンドを実行すると、複数のファイルが作成されます。
このファイルがあるおかげで、Stimulusが気軽に使える状態になります。

作成されるファイルの中に、Stimulusアプリケーションを起動している以下のファイルがあります。
“`js:app/javascript/controllers/application.js
import { Application } from “@hotwired/stimulus”

const application = Application.start()

// Configure Stimulus development experience
application.debu

元記事を表示

devise_token_authで作る認証機能

## devise_token_authとは?
devise_token_authはRailsでトークンベースの認証機能を作れるgemのこと。
フロントとバックを分けて開発している時なんかに使う。
クライアントは、発行されたトークンを用いてユーザー認証を行う。
メールアドレスを用いた本人確認や、パスワードのリセットといった、webアプリケーションによくある機能もこのgemで作ることができる。

## 実行環境
Ruby 3.3.0
Rails 7.0.8

## 環境設定
まずは必要なgemをインストール。
“`
gem ‘devise_token_auth’
gem “devise”
gem “rack-cors”
“`
“`
bundle install
“`
:::note info
CORSの制御のため、rack-corsも必要
:::

deviseとdevise_token_authをインストール
“`
rails g devise:install
rails g devise_token_auth:install User auth
“`
:::note in

元記事を表示

Ruby 3.3.0 Rails 7.1.3 でYJITを有効にする

あるWebアプリケーションの Ruby on Rails のバージョンを`7.1.3`に上げました。 Ruby のバージョンを`3.3.0`に上げました。

ついでにYJITを有効にしました。
[Enable YJIT · pubannotation/pubannotation@f9284cd](https://github.com/pubannotation/pubannotation/commit/f9284cd97a57af10e05b33360c0c45634749a97e)
次のファイルを追加しました。

“`ruby:config/initializers/enable_yjit.rb
if defined? RubyVM::YJIT.enable
Rails.application.config.after_initialize do
RubyVM::YJIT.enable
end
end
“`

運用中に何かの理由で無効にしたくなったら、コメントアウトするかファイルごと削除します。
この方法は、最新のRuby on Railsに取り込まれているそのま

元記事を表示

OTHERカテゴリの最新記事