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

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

Rails Admin が重い – N+1クエリに対策する設定

# 設定例

たとえば user 対 books が関連している場合、
`rails_admin.rb` に以下のように設定

“`rb
RailsAdmin.config do |config|

config.model ‘User’ do
configure :books do
eager_load true
end
end
“`

# ページ閲覧で発行されるSQLクエリの例

RailsAdminの設定は eager load という名前だが、 Railsの eager load ではなく preaload 的なクエリが発行されていた

“`sql
SELECT `users`.* FROM `users` ORDER BY users.id desc LIMIT 20 OFFSET 0

SELECT `books`.* FROM `books` WHERE `books`.`user_id` IN (65, 64, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51,

元記事を表示

Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)’ has been deprecated. エラー解消法

# はじめに
dockerでdocker compose run web bundle 〜 実行時に下記の注意が出ました。
こちらの解決方法について記載します。

:::note warn
Calling `DidYouMean::SPELL_CHECKERS.merge!(error_name => spell_checker)’ has been deprecated. Please call `DidYouMean.correct_error(error_name, spell_checker)’ instead.
:::

# 解決方法
bundlerのバージョンを上げる。

“`
bundle update –bundler
“`

# 補足
私の環境ではDockerfileにbundlerのアップデート文を記載してdocker compose buildをしてもbundlerのアップデートがされませんでした。
コンテナで直接コマンドを実行するとbundlerのアップデートに成功して注意が解消されました。

“`
docker compose run web bund

元記事を表示

erbからslimに変換する際の`File.exists?` メソッド使用についての解決方法

# はじめに

erbからslimに変換しようとしてエラーで詰まって調べてあまり有用な記事がなかったため
作成することにします(自分見直し用でもあります!)

# 起きたこと

dockerコンテナ内で

“`bash
erb2slim app/views/users/ app/views/users/ -d
“`
をしてapp/views/users/内のerbファイルを一括でslimファイルに変換しようとしたところ
“`
NoMethodError: undefined method `exists?’ for File:Class
Use –trace for backtrace.
“`
とエラーが出て、できなかったので
“`bash
erb2slim app/views/users/ app/views/users/ -d –trace
“`
–traceオプションをつけてエラーが起きているファイルを特定したところ
“`
/usr/local/bundle/gems/html2slim-0.2.0/lib/html2slim/converter.rb:1

元記事を表示

【Google Cloud Vision API】Rails6.1で画像登録時に関連度を判定する

# はじめに
ポートフォリオの課題でお花屋さんの商品予約サイトを作成中のとき。
Google Cloud Vision APIを使って、お花と関連のない商品写真が登録された場合、管理者の承認が必要になるという設定を作ることにしました。

※前提として、いろんなお花屋さんが登録した商品の中から、ユーザが選ぶという形のサイトになっているので、「複数のお花屋さん」「複数のユーザー」「サイトの管理者」という3パターンのユーザが存在しています。

# 実装内容
Cloud Vision APIについては公式ドキュメントを確認してみてください。

https://cloud.google.com/vision?hl=ja

このページ内の「デモ」の部分で画像をアップロードしてみると仕組みがイメージしやすいです。

## 準備
visionAPIの導入については学習課題を見ながら進めたため省きます。
導入について以下の記事が参考になりそうでした。

https://qiita.com/ysda/items/67c983510f4d7d1c6982

https://qiita.com/dam-san

元記事を表示

【Rails6.1】初心者なりに試行錯誤してwebpを使おうとした話

# はじめに
前職のWebショップで、ページの表示スピードが遅いからコンサルタントの方にアドバイスいただいて、webpを導入してもらったという経験がありました。
その記憶から、webpを使えばページが軽くなるのでは?と思い、ポートフォリオの画像にwebpを使うことにしました。

# 実装内容
結論から言うと、もともと用意してあったvariantを使った画像表示のためのメソッドに「, format: :webp」を追加するだけでwebpの導入はできました。

“`diff_ruby:models/item.rb
has_one_attached :item_image

def get_item_image(width, height)
+ item_image.variant(resize_to_fill: [width, height], format: :webp).processed
– item_image.variant(resize_to_fill: [width, height]).processed
end
“`

## モデル
モデル

元記事を表示

【Rails6.1】画像を保存する際のリサイズとActiveStorageのvariantについて

# はじめに
画像ってなんでもかんでも登録できたら、データベースを圧迫してしまうのでは…?という心配が浮かびました。
そこで、保存時に画像をMiniMagickで加工してリサイズしてから登録する設定にしてみました。

# 実装内容

## 準備

画像の扱いには、MiniMagickとActiveStorageを使用しています。
また、MiniMagickを使用するにはImageMagickが必要とのことだったのでインストールしておきます。

https://github.com/minimagick/minimagick

“`
$ brew install imagemagick
“`
“`ruby:Gemfile
# ActiveStorage
gem ‘image_processing’, ‘~> 1.2’
# MiniMagick
gem ‘mini_magick’
“`

## 画像保存時のコントローラの記述
商品を登録する際のコントローラの記述がこちら。
ちなみに長くなるので省きましたが、同じような記述をupdateアクションにも追加しています。

“`ru

元記事を表示

【2024年6月】Rails7をWindows上で環境構築する方法

「Railsをインストールできない」

RailsはWebアプリ開発フレームワークで初心者にもわかりやすいと言われます。

しかし、環境構築で挫折する人が多いのも現状です。

今回はRailsをWindows11で開発できるセットアップを行います。

せっかく始めるのに、何もできないまま終わりたくないですよね。

動画でサポートしていきます。

YouTubeを活用してぜひ始めてみてください。

結論は、WSL2を使いましょう。

# YouTubeでの解説-2024年6月24日投稿

### リンク先

WSL2

https://learn.microsoft.com/ja-jp/windows/wsl/install-manual

Homebrew

https://brew.sh/ja

### Railsのインストール
“`
sudo apt update && sudo apt upgrade
sudo apt install -y autoconf bison patch build-ess

元記事を表示

uuid生成からルーティングでuuidをidとして使用するまでの方法を解説

今回は実際のシステム開発の現場でuuidを使ったのでこれについてまとめました。

## uuidとは?
uuid(Universally Unique Identifier)は、128ビットの一意の識別子として用いられます。

わかりやすくいうと、uuidは8-4-4-4-12の形式で表される32文字の16進数と4つのハイフンから構成されるため、1兆個のuuidを生成しても重複する確率は低いです。

そのため、大規模なシステムや分散システムでも、重複しない識別子として利用できます。主にデータベースやネットワーク上で一意の識別子として使用されます。

またuuidは16バイトのバイナリ形式で保存するため、文字列形式の36バイトに比べて大幅にストレージを節約できます。合わせてインデックスが小さくなり、検索が高速化されます。

## uuidの設定

#### ・ステップ1
まず、userモデルを作成し、「t.binary :uuid, limit: 16」というカラムを設定し、「add_index :users, :uuid, unique: true」という設定を加えます。
“`
cl

元記事を表示

Heroku + Rails + S3 Google Search Console で「サイトマップを読み込めませんでした」を解消する

# 背景
herokuで動かしている web ページのサイトマップをGoogle Search Console で登録したい。

※ Herokuのダイナモはエフェメラル(一時的)ファイルシステムを採用しているため、デプロイごとにリセットされます。そのため、サイトマップのような定期的に更新されるファイルは、Heroku上で直接生成しても、次のデプロイ時に消えてしまいます。そのため、永続的なストレージへの保存(例えばAmazon S3など)が必要になります。

> Storing static files elsewhere is crucial for Heroku apps since dynos have an ephemeral filesystem. Whenever you replace a dyno or when it restarts, which happens daily, all files that aren’t part of your application’s slug are lost. Use a storage solution like S3 t

元記事を表示

小規模Railsチームの私はDDDを学ぶべきなのか

# エクスキューズ
これは社内向けの発表なので、フェーズやメンバーのスキル想定が大幅に異なる可能性があります。
Evans本、IDDD、ボトムアップ本ぐらいしか読んでないので、あくまで現時点での感想として捉えてください。

# 想定読者
– 1チーム10人程度のRails
– 全員がスキルフルというわけではなく、インフラ・フロントの分野でも課題が残っている
– 規模感としてテーブルは200~300ぐらいあってまぁまぁ複雑
– レビューでServiceクラスにドメインの知識を流出してしまっています、と言われたがドメインの定義って何?
– QiitaなどでDDDについて書かれた記事を見かけることはあるが、謎の用語が多すぎてよくわからない

# 結論
そんなに優先度高くない

# 理由
– 他に勉強しないといけないことがいっぱいある
– クラウドインフラやIaC
– フロントエンド周りのあれこれ
– Ruby, Railsのバージョンアップ
– 前提としている知識が多い
– SOLID原則などのソフトウェア工学
– オブジェクト指向についての理解
– デザインパタ

元記事を表示

,で区切って 複数ワード検索 実装

# はじめに
ポートフォリオ制作中です!
,で区切って複数のワードを検索できるように実装したためアウトプットします✍️
複数検索のアウトプットなので、検索機能についてはさらっと書いています!
検索機能実装については下記記事がわかりやすかったです!

https://qiita.com/hapiblog2020/items/6c2cef49df5616da9ae3

複数ワード検索はもっといい方法を検討中です🧐
もしあれば教えていただけると幸いです!

※旅行やデートのプランを共有するアプリなので、投稿機能はPostではなくPlanを使用しています!

# 開発環境
・ruby: 3.1.2
・Rails: 6.1.7.7
・Cloud9
・bootstrap導入済

# ER図

# ルーティング
“`routes.rb

元記事を表示

いいねしたユーザーの一覧表示

# はじめに
ポートフォリオ制作中です!
いいね数をクリックするといいねしたユーザーの一覧を表示
できるように実装したためアウトプットします✍️

※旅行やデートのプランを共有するアプリなので、投稿機能はPostではなくPlanを使用しています!

# 前提
いいね機能は実装済み、いいねボタンの非同期化済みです
ご留意ください!

# モデル

“`plan.rb
class Plan < ApplicationRecord # アソシエーション belongs_to :user has_many :likes, dependent: :destroy # この行を追加 has_many :liked_users, through: :likes, source: :user #throughで、likesを通してuserのカラムを使用できる : end ``` # ルーティング ```routes.rb Rails.application.routes.draw do scope module: :public do resources :p

元記事を表示

Googlemap geocodingが動作しない

# はじめに
ポートフォリオ制作中です!
今回はデプロイ後のGoogleMapとGeocodingがうまく動作しなかったため

本番環境でも動作せず、開発環境でdb:seedし直すと開発環境でも動作しなくなってしまったため、解決方法をまとめておきます!

# エラー状況

本番環境でも、開発環境でも、rails db:seedすると下記のエラーが出るようになった

“`
$ rails db:seed
Google API error: request denied (API keys with referer restrictions cannot be used with this API.).
“`
また、Googlemapは表示されるが、緯度経度が正しくないため変な場所にピンが刺さっている(Google Mapが表示されない問題もありましたが、本番環境ウェブサイトのURLを許可してないだけだった)

# 原因
このエラーはコードの問題ではなく、APIの制限設定によるものです

https://developers.google.com/maps/faq?hl=ja#brow

元記事を表示

【Rails, MySQL, ORM】where(‘user.id’: 1)ってことができる

業務開発でRailsを使用しており、ORMもよく使用しているのですが、業務開発を通して知った `where` 句の文法的なのをここで紹介していきます。

## where(column: value)
これはRailsのwhere句の一番オーソドックスな書き方だと思います。
whereをメソッドチェーンで繋げていけば `and` 句となり条件をより絞ることができます。
“`ruby
# e.g.
User.where(id: 1)
User.where(gender: “man”).where(name: “hoge”)
“`

## where(column: [value])
これはいわゆる `where in` 句の書き方で、 `or` 検索をかけたい時は基本的にこの書き方が一番いい気がします。
若干話が変わりますが、SQLアンチパターンにおいて、 `or` 検索はインデックスが効かない `where` 句の書き方ですが、 `where in` 句はインデックスが効く書き方なので、もし `or` のような**和集合条件**でインデックスが効く検索をしたい場合は **`wher

元記事を表示

DHH流のルーティングの書き方

今回は私が現場で使用しているルーティング構成について自分のメモとしてまとめました。

## DHH流ルーティングとは?
DHH流ルーティングとは、Railsの創始者であるDavid Heinemeier Hansson(DHH)の提唱するルーティング設計の方法論です。

DHH流ルーティングでは、リソースに対して標準的なCRUD操作(Create, Read, Update, Delete)を簡潔に定義し、カスタムアクションやネストリソースを最小限に抑えることで、ルートの複雑さを減らして記述を行うというものです。

つまり、デフォルトCRUDのindex , show, new, edit, create, update, destroyメソッドのみですべてを表現するということです。

## 具体的な設定例

### ・ 例1
“`
namespace :admins do
root ‘dashboards#index’

resources :staffs
resources :users do
resource :enable, only

元記事を表示

【Rails6.1】番環境で発生したMysqlのサブクエリに関するエラーを解消

# はじめに
デプロイを行った際にSQLでエラーが発生しました。

:::note alert
ActionView::Template::Error (Mysql2::Error: This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery’):
:::

# エラーの内容
>Google翻訳より…
>このバージョンの MySQL はまだ「LIMIT & IN/ALL/ANY/SOME サブクエリ」をサポートしていません

LIMIT句が使用されている箇所の構文が、MySQLのバージョンで使用できない記述になっているようです。

さらにエラーメッセージを見ると、以下のビューを表示する際に引っかかっているようでした。
“`html:ショップ(Shop)詳細(show)のビューページ
<%= image_tag @shop.get_shop_image(500,500), class: "w-100 p-1" %>
<%= render 'public/favorite_shops/btn',

元記事を表示

【Docker】DockerでRailsのデバッグを実行する【Rails】

## やりたいこと
Dockerで実行しているRailsアプリケーションのデバッグを実行する

## なぜ行うか
設定なしにbinding.pryをソース内に記述しても止まらないため、以下の設定が必要。

## 方法
1. docker-compose.ymlに下記を追加

“`yml:docker-compose.yml
web:
# 以下を追加する
tty: true
stdin_open: true
“`

# ターミナルで実行しているdockerにattachする

“`docker:
# 起動しているdockerのコンテナ名を調べるため、以下を実行
$ docker ps
# 調べたコンテナ名を利用して、docker環境にattachする
$ docker attach コンテナ名
“`

## 最後に
上記を行うとdocker環境でpry-byebugを利用したデバッグを利用できます。

元記事を表示

Rails:パーシャルでインスタンス変数を使用してはいけない理由

### 読んで欲しい人
– パーシャルにインスタンス変数を書いてエラーになった人
– 過去の自分

### 動作環境
– MacOS 14.5
– ruby 3.3.0
– Rails 7.1.3.3
– psql (PostgreSQL) 14.11

### 課題
– 下記のコードにレビューをいただいた

“`ruby:_post.html.haml
# パーシャルファイル
.p-4.d-flex.flex-column.justify-content-center.mt-6
.post-container.p-3
.mb-3
= @user.name
“`

レビュー内容: パーシャルでインスタンス変数をつかわないように

### なぜダメか

**理由1**

そもそもパーシャルの利用目的は、

**viewの一部を切り出して、再利用するためのもの**

なので、
インスタンス変数をパーシャルの中で使用してしまうと、他の部分で再利用ができない。

**理由2**

キャッシュの効率が悪い

Railsではパーシャルを呼び出すタイミング(render)

元記事を表示

Railsヘルパー

“`.rb
# ページごとの完全なタイトルを返す
def full_title(page_title = ”)
base_title = “Ruby on Rails Tutorial Sample App”
if page_title.empty?
base_title
else
“#{page_title} | #{base_title}”
end
end
“`
のようなヘルパーを作成することで

“`.application.html.erb
<%= full_title(yield(:title)) %>
“`
で呼び出すことができる

元記事を表示

rails7にsotalbeを実装

# はじめに
久々にrailsの並び替え機能を実装したので、その際の作業録です。

# 実装
昔は、以下のgemを利用した時期もありましたが、jqueryが利用されていることだったり、メンテがされてないとかがあったので、今回は利用しないことにしました
https://github.com/itmammoth/rails_sortable

今回は、stimuls componetsにあるこちらを利用しました。
https://www.stimulus-components.com/docs/stimulus-sortable

### javascript関係
“`
yarn add @stimulus-components/sortable sortablejs @rails/request.js
“`

“`js:app/javascript/controllers/index.js
import { Application } from ‘@hotwired/stimulus’
import Sortable from ‘@stimulus-components/sorta

元記事を表示

OTHERカテゴリの最新記事