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

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

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

元記事を表示

未ログインユーザーの閲覧数カウント

# はじめに
絶賛ポートフォリオ制作中です!
今回は未ログインのユーザーが投稿詳細画面を表示した時に、
閲覧数をカウントするように実装したためアウトプットします✍️

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

# ER図

# モデル、マイグレーションファイル作成
#### モデル作成
“`
$ rails g model ViewCount user:references plan:references
“`

:::note info
referencesとは(直訳:参照、参考)
名前の通り、作成済みのテーブルを参照する場合に使用します
コマンドを実行すると下記カラムがマイグレーションファイルに自動追加されます
“`
t.references :user

元記事を表示

一覧画面に検索機能実装 Rails ransack

## はじめに
今回はRailsの検索機能実装でransackを使用したので、使い方について記載します。
Rails初心者のため、間違いなどあればご指摘お願いします。

## ransackとは
Railsで検索の実装を行うgemのことです。
ransackがなくても検索の実装はできるのですが、ransackを使用することで簡単に検索機能の実装が可能です。

## 使い方
### ①Ransackインストール

“`ruby:Gemfile
gem `ransack`
“`

“`ruby:コマンド
# アプリをインストールする
$ bundle install
“`

### ②コントローラを修正する
検索ワードを受け取り、検索結果をインスタンス変数にセットします。

“`ruby:tasks_controller.rb
def index
@q = current_user.tasks.ransack(params[:q])
@tasks = @q.result(distinct: true).recent
end
“`

### ③ビューを

元記事を表示

TypeScriptの新しいORMに同期APIを採用した理由

私は[Accel Record](https://www.npmjs.com/package/accel-record)という、TypeScript用ORMライブラリを開発しています。
Accel Recordは他のTypeScript/JavaScript用ORMライブラリとは異なり、非同期APIではなく同期APIを採用することにしました。

この記事では、Accel Recordが同期APIを採用するに至った経緯と理由を整理します。

## 作ろうとしたORM

『[TypeScriptで書ける型安全なRuby on Railsを求め、ORMの開発を始めた](https://qiita.com/koyopro/items/748ddd27aa32ff14c95f)』という記事で、TypeScript用のORMライブラリを作り始めたことを紹介しました。

私の希望は「TypeScriptにもRuby on Railsくらい開発効率の高いフレームワークが欲しい」というものです。そのために、RailsのActive Recordのような機能を持つORMをTypeScriptで作れないか試

元記事を表示

【Rails6.1】同じUser同士じゃない場合のDM機能(課題は残る)

# はじめに
メッセージ(DM機能)を作成した際、私が作成したメッセージ機能の場合、同じユーザ同士ではなく、ShopユーザとMemberユーザという異なるユーザとのやり取りになりました。

この場合のメッセージの表示方法などに何度も混乱させられました。
正直、あまり良いやり方とは自分でも思えないのですが、頑張ったので振り返りのために記録しておこうと思います。

# 前提

もっと簡単な方法があったんじゃないかという気もしている前提条件。

![2024-06-20メッセージ機能1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/bb2a2863-5ab2-9032-4c7c-7ac0dbe2f407.png)
member用のメッセージデータのmember_messagesと
shop用のメッセージデータのshop_messagesを作っています。

※Roomsにあるis_take_careは対応待ちと対応済みの判定を行うためのデータ。
(trueなら対応済みでfalseなら対応待ち)

元記事を表示

【Rails6.1】2種類のレイアウトを使ったブックマークを非同期にする方法

# はじめに
ブックマーク機能を作成する際に、詳細ページと商品一覧ページで違う形のボタンを使用することにしました。
この状態で非同期にするにはどうしたら良いんだろう…?と悩みながら進めたので、実際に使った方法を記録しておきます。

これが、商品詳細のブックマーク。横長のボタンになっています。

![2024-06-20ブックマーク2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/06a17ce4-1a3b-4d21-e39c-1f009de43b65.png)

こっちが商品一覧のブックマーク。リボンのアイコンになっています。

![dc1875f3917c3b8010e0b6936264613e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3762011/ee8cf26c-97c0-3411-5e4a-f84b334f97b3.png)

# 今回のポイント
create.js.erbファイルの記

元記事を表示

[Rails] エラーメッセージを日本語で設定する

# はじめに
フォームの入力で、バリデーションで失敗した際に、エラーメッセージを表示させると思います。
その場合、デフォルトだと英語になります。

日本語で表示させるためには、設定が必要なのと、メッセージも自由に記載することができます。
今回はその内容をアウトプットいたします。

# 設定

`config/application.rb`に、以下を記載いたします。

“`rb:config / application.rb
config.i18n.default_locale = :ja
“`

続いて、`config/locales/ja.yml`に記載いたします。

“`yml:config / locales / ja.yml
ja:
activerecord:
attributes:
hoge_model:
fuga_column: ‘fugaカラム’
errors:
models:
hoge_model:
blank: ‘%{attribute}は必須項目です’

元記事を表示

Railsでいいね機能:ビューファイル中で使用しているいいね判定メソッドでn+1問題が発生した時の対処法

## 読んで欲しい人
– Railsでいいね機能を実装していて
– ビューのループ中でクエリを発行するメソッドを使用している人
– SQLクエリがたくさん出てきて、n+1問題が発生している人
– 過去の自分
## 動作環境
– MacOS 14.5
– ruby 3.3.0
– Rails 7.1.3.3
– psql (PostgreSQL) 14.11

## 作っているアプリの構造
### 概要
– 小さいX(旧ツイッター)みたいなアプリ
– ログイン機能
– 短文の投稿機能
– いいね機能
### テーブル設計
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3819522/487a583f-ba66-738d-616c-8690cb94d7da.png)
## エラー・課題
“`sql
app/models/user.rb:23:in `already_liked?’
16:48:02 web.1 | Rendered posts/_li

元記事を表示

OTHERカテゴリの最新記事