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

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

Ruby on Railsのモジュラーモノリス化を推し進めるpacks-railsというgemがすごいという話📦

こんにちは、akitoshiga.jpです。

現在Ruby on Railsのモジュラーモノリス化を行っており、その際に利用した`packs-rails`というgemが大変便利だったのですが情報が少なかったので紹介します。

## 1. packs-railsとは?
一定の規則に従って、単一のRails on Railsアプリケーションをモジュール分割するgemです。
このgem単体でも利用できますが主に[packwerk](https://github.com/Shopify/packwerk)と組み合わせて使われることが多いと思います。
`packwerk`とはRuby on Railsの静的解析を行うgemでモジュールごとの依存関係の管理ができます。

https://github.com/rubyatscale/packs-rails

## 2.一体何がすごいのか?
### 2.1 (ほぼ)設定不要
`packs-rails`は内部で`zeitwerk`というgemを利用しています。
`packs-rails`の指定のディレクトリ構成に従えば、`zeitwerk`のおかげ

元記事を表示

Ruby on Railsでコントローラー名と紐づいているもの

コントローラー名をBooks→Testに変える場合

### routes.rbにて名称変更
/kakeibo/config/routes.rbを下記の通り変更する。

get “/books”, to: “books#index”

get “/books”, to: “test#index”

### コントローラーファイルの名前を変更

/kakeibo/app/controllers/books_controller.rb

/kakeibo/app/controllers/test_controller.rb

### ファイル内のコントローラー名を変更する
/kakeibo/app/controllers/books_controller.rbを下記の通り変更する。

class BooksController < ApplicationController ↓ class TestController < ApplicationController ### viewsのフォルダ名を変更 /kakeibo/app/views/books ↓ /kakeibo/app

元記事を表示

DeviseとCanCanCanを併用したセキュリティ保護

細かいことを飛ばして具体例を見たい場合は以下のリンクへどうぞ(私自身、備忘録的に見返すならばこの部分になると思っています)

https://qiita.com/KM9973/items/0b132f0ac91322939d44#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9
# RailsアプリケーションでのDevise導入と認証の基本

### 導入

RailsアプリケーションにDeviseを導入した際、すべてのビューがログインせずともアクセス可能な状態になってしまうことがあります。これは、適切な認証フィルターが設定されていないために発生します。

### 解決策

#### ApplicationControllerでの認証フィルターの設定

アプリケーション全体でユーザーがログインしていることを要求するには、`ApplicationController`に`before_action :authenticate_user!`を設定します。これにより、全てのコントローラーでアクションが実行される前に

元記事を表示

Rails DM機能の実装

# はじめに
今回はXクローンの実装にてDM機能の実装をしたので、自分自身の備忘録として、また今後フォロー機能を実装する方のお役に立てればと思い今回も記事を書くことにしました。

# DM機能の作成
要件として、ユーザー同士(1対1)でメッセージを送り合うことができる機能を実装する。
※ 前提として、ユーザー登録がすでに実装されているものとします。

# DM機能の流れ
相手ユーザーの詳細ページorポストのメニューorサイドバーのメニューからチャットに進む

roomがなければ新規で作成され、そうでなければ存在するroomに遷移する

roomでメッセージを送ることができるようになる

このように至って普通なDM機能を実装していきたいと思います。

# DM機能について
DM機能では、usersテーブル、roomsテーブル、entriesテーブル、messageテーブルを使用します。

2人のユーザーがチャットルームでメッセージをやりとりするというイメージを思い浮かべながら実装していきます。

まず、ユーザーを管理するusersテーブルがあります。
ユーザーはroomsテーブルと

元記事を表示

webサーバーはフレームワークに組み込まれている

# はじめに
webアプリケーションフレームワークはwebアプリ開発を助けるツールとして広く用いられています。例えばPythonのDjangoやRubyのRuby on Rails, JavaのSpring bootなどが挙げられるでしょう。それらはアプリケーションサーバーにおけるMVCモデルを提供するフレームワークであると多くの場合説明がされますが、実は簡易的なWebサーバーも持ち合わせています。勉強した今考えれば当たり前なのですが、勉強しながら少し混乱したところでもあるのでここにまとめます。

# 3層構造とMCVモデル
まず復習ですが、webアプリケーションは三層構造になっています。
①プレゼンテーション層
②アプリケーション層
③データ層
ここで①はクライアントから来たリスエストを捌き、クライアントのウェブブラウザ上に情報を提供する働きを、②はプレゼンテーション層から送られてきた指示に従って動き、アプリケーションの動的部分を担います。③はデータを管理している層で、アプリケーション層からの指示(例えば顧客情報を出す)に従ってデータベースからデータを提供します。そして、これらの3つ

元記事を表示

Parallel gemで実装した処理をRspecでは同じスレッド上で動かす

以下のようにParallelにて処理を並列スレッドで実行しているとき、

“`ruby:hoges_controller.rb
def index
procs = [
-> { hoge1 },
-> { hoge2 },
-> { hoge3 }
]
result = Parallel.map(procs, in_threads: 3, &:call)
end
“`
Rspecではletやsubjectが変数に対してロックを獲得するため、複数スレッドで変数の参照待ちになりデッドロックが発生し、テストが永遠に終わらなくなってしまう

それを解決するために、Rspec上では直列で処理を実行するようParallelをモックして、ブロックを呼び出すだけにする

“`ruby:hoges_controller_spec.rb
describe ‘#index’ do
subject { get hoges_path }

# Parallel.mapの引数で渡された配列をmapしてcallするだけ

元記事を表示

Dockerイメージサイズを劇的に削減する方法【Rails7】

# はじめに
近年、アプリケーションの開発とデプロイのプロセスは、Dockerのようなコンテナ化技術によって大きく変革されています。Dockerコンテナの効率的な利用において、イメージサイズの最適化はデプロイの速度を速めるだけでなく、セキュリティリスクを低減し、ストレージコストを削減する上で重要な役割を果たします。

Railsアプリケーションの開発では、その豊富な機能性と便利さにより、依存するGemやアセットが増加し、結果としてDockerイメージのサイズが大きくなる傾向にあります。

この記事では、RailsアプリケーションのDockerイメージサイズを劇的に削減するための具体的な手法を紹介し、デプロイの速度向上とコスト削減を実現する方法について解説します。

全ての検証コードはGitHubリポジトリに公開していますので、詳細は下記リンクからご確認ください。
[検証コードGitHubリポジトリ](https://github.com/mabo-matsu/rails7-docker-sample)

# 1. Rubyのベースイメージ比較
イメージサイズの比較を行った結果、下記

元記事を表示

Railsのscopeの良くない書き方

## はじめに

Railsのモデルでよく`scope`を使用した記述をします。
`scope`の使い方が悪く、予期せぬクエリが呼ばれていたので備忘録として残します。

## 良くなかった書き方

モデル名やscope名は仮で入れています。

“`rb
class Model
scope :prev_staff_id, ->(customer_id) {
where(customer_id: customer_id)
.order(updated_at: :desc)
.limit(1)
.pick(:staff_id)
}
end
“`
`Model.prev_staff_id`とすれば、以前のスタッフIDを返すことを期待しています。
`limit(1)`を指定して、`staff_id`を指定しているので一見クエリに問題はなさそうです。

## 問題点

### ①メソッドチェーンできるようにしておく

メソッドチェーンは今回の`prev_staff_id`に加えて、`active`のような別のスコープが合ったときに以下のように

元記事を表示

SDK for Rubyを使用してS3で署名付きURLを発行し、ブラウザにてダウンロードを行う。

# 実装したもの
view上のダウンロードボタンを押すと、S3にアップロード済みのログデータの署名付きURLを発行してリダイレクトを行いダウンロードさせる機能を作成しました。
今後似たような機能を作成するときに困らないように自分の言葉で備忘録として残しておくための記事となります。

# 必要な知識、参考にした記事
### SDK for Ruby
RubyによってS3などのAWSサービスにアクセスし管理ができるようになるものです。SDKはソフトウェア開発キットと呼ばれるけどあんまりピンときてない。現状私はライブラリ、フレームワーク、APIを提供するパッケージというイメージを持っています。

なお、今回の記事についてはSDK for Rubyの導入については省略します。

https://aws.amazon.com/jp/sdk-for-ruby/

### AWS::S3::Client
SDK for Rubyに含まれる「クラス」でS3との低レベル(抽象度が低く詳細なことはできない)なAPI通信を行うことができます。
すでに用意されたメソッドによってS3に対してさまざまな操作を行う

元記事を表示

Rails 7 と Vite: Uncaught TypeError 解決策

最近、Rails 7 アプリケーションで Vite を使用して開発を進めている中で、特定のエラーに直面しました。そして、その解決策を共有したいと思います。

## 問題

開発中、以下のようなエラーがブラウザのコンソールに表示されました。

“`
An import map is added after module script load was triggered.
localhost/:1 Uncaught TypeError: Failed to resolve module specifier “application”. Relative references must start with either “/”, “./”, or “../”.
“`

このエラーは、JavaScript モジュールのインポートが適切に解決されないことに関連しています。

## 暫定的な解決策

エラーの原因を特定し解決する過程で、`app/views/layouts/application.html.erb` ファイル内の以下の行をコメントアウトしたところ、エラーメッセージが消えまし

元記事を表示

【Rails】少しだけ楽!Bootstrapのモーダルを使って通知機能を作成する(いいね・コメント・フォロー)

こんばんは!
PF作成でモーダルを使った通知に憧れ、記事を参考にしてみたもの非同期通信や難しいJavascriptの記述が理解できず、エラー沼から抜け出せなくなったので、もう簡単にできるモーダル通知を作るしかない!と思いBootstrapを使って実装してみました。なので少しだけ楽!な実装です(笑)

ちなみに確かに元の記事と比べると簡単にはなりますが、記述箇所が多くて大変なのでなるべく丁寧に解説できるように紹介をしていきたいと思います。
この記事ではまずは通知を表示させるというところまで解説します。

::: note warn
通知の既読などはもし実装に余裕があれば載せようかとおもいますので、ご了承ください。また、元の記事を一度参考にして作った状態から色々作り直しているので、いらない記述などがもしあれば教えていただきたいです。
→**2024/3/12に通知数の表示と既読処理の追記をしました!**
:::

参考記事はこちら。

https://zenn.dev/ganmo3/articles/7afaff32809681

## 完成形・実装時の諸注意
完成形はこちら!ベルマークを

元記事を表示

Dockerで環境構築(Rails7+mysql)

## はじめに
 ポートフォリオ作成のため、Dockerにて環境構築を行いました。
その時の流れと、ファイルの意味について調べたことを記録しました。
初学者のため、間違えていたら申し訳ありません。

## 環境
PC: mac(Apple M1)
Ruby: 3.1.4
Rails: 7.0.8

## 作業内容
### ① ディレクトリ下にファイルを作成する
ディレクトリ
“`
好きなディレクトリ名/
├── Dockerfile
├── docker-compose.yml
├── entrypoint.sh
├── Gemfile
└── Gemfile.lock
“`
#### ファイル一括作成コマンド
“`
touch Dockerfile docker-compose.yml Gemfile Gemfile.lock entrypoint.sh
“`
### ② ファイルの中身を記述する
#### ファイルの中身
“`:Dockerfile
FROM ruby:3.1.4 # rubyのバージョンを指定

RUN mkdir /app # コン

元記事を表示

【Rails】環境変数で条件分岐するときの小ネタ

## これはなに?

Railsにて、条件分岐を環境変数でおこなおうと考えました。
このときに上手くいかなかった理由を深堀りし、より良い方法を学んだのでそのメモです。

### やりたいこと

環境変数に`HOGE=true`を設定し、以下のようなコードで条件分岐させることを目標とします。

“`ruby
if # ENV[HOGE]がtrue
# なんらかの処理
end
“`

## やったこと

### 間違いパターン

“`ruby
if ENV[‘HOGE’] == true
puts “HOGE is true”
end
# “HOGE is true”は出力されない
“`

このコードでは、if節はfalseを返します。
一見すると不思議です。

コンソールで`ENV[‘HOGE’]`そのものの真偽値はtrueを返すのに、なぜでしょう?

“`ruby
!!ENV[‘HOGE’]
=> true
“`

その理由は、環境変数から取得される値はすべて文字列として扱われるためです。
.envファイルで`HOGE=true`と設定した場合でも、`ENV[‘HO

元記事を表示

Dockerを使ったRailsとNext.jsの開発環境の構築

### 自己紹介
初めまして、オーリーです。未経験からエンジニアへ転職活動中の者です。
先日、Next,js, Typescript、Rails(api)、Fargate, Terraform、Git Hub Actionsを使用したポートフォリオを作成しました。
その際に作成したDokerfile、docker-composeをアップします。
何分私も初学者ですので、もっと良い書き方があると思います。あくまでご参考までにー。

—–
### 概要
rails, next.jsの開発環境のDockerfileとdocker-compose.yml

—–
### ディレクトリ構成
app
├── backend
│ └── api
│ ├── Dockerfile.dev
│ └── entrypoint.sh

├── frontend
│ └── front
│ └── Dockerfile.dev

└── docker-compose.dev.yml

– ディレクトリ構成:
.`app`ディレクトリの下には`ba

元記事を表示

docker compose run時にNameError: uninitialized constant Nokogiri::HTML4と遭遇した時の対処法

Dockerを使ってRailsの環境構築を行なっている時に遭遇したエラーの解決方法を備忘録も兼ねてここに記します。

開発環境
M2チップ Mac Book Air
OS: MacOS Sonoma
Rails: 5.0.0.1
DB: MYSQL 5.7
Ruby: 2.4.6
※詳細は省きますが、Windows11の環境でも同様のエラーに遭遇しました。
 同エラー遭遇時にPCを上記のMac Book Air に買い換えた為、Windows環境では解決まで  の確認はできていませんが、恐らく解決できると思います。

## 実行したコマンドと遭遇したエラー

“`
実行したコマンド
docker compose run web bundle exec rake db:create
“`

“`
遭遇したエラー
rake aborted!
NameError: uninitialized constant Nokogiri::HTML4
Did you mean? Nokogiri::HTML
“`

## エラー解決の為に行なったこと
1, Gemfileを編集して下記の行を

元記事を表示

【Rails】一覧表示の順番を指定する(古い順、新しい順)

こんばんは!
ポートフォリオ実装でユーザーの使いやすさを考えたときに、一覧といってもものによっては古い順、新しい順と変えた方がよさそうだと気づき、実装してみました!
実装自体はコントローラ―の記述を少し加えるだけだったので、ご紹介したいと思います。

## 環境
AWS Cloud9
Rais 6系

## 方法
### 新しい順
例えばですが、普通の投稿の一覧などはより新しい情報をユーザーに見せたいですよね!特に投稿1つ1つに文脈などの関係がない場合は新しい順の方が適しているといえます。
そのような場合どのように新しい順にするか説明したいと思います!

普段だと一覧表示をしたい際には
“`rb:app/controller/xxxx_controller.rb
class XxxxsController < ApplicationController def index @posts = Post.all end end ``` というように記述しますよね。これだと特に順番は指定されていない状態で、更新などがあると順番が変わる可能性があります。 そのため、新しい投稿

元記事を表示

Rails 7 + Vue.js 3 でaxiosを使ったAPI通信で遭遇したエラーとその解決

Rails 7とVue.js 3を組み合わせた開発では、非同期通信のためにaxiosを利用する場合があります。この記事では、axiosを使用してAPI通信を試みた際に発生したエラーと、その解決方法について説明します。

## 問題点

Vue.jsコンポーネントでaxiosを使用しようとした際に、次のようなエラーが発生しました。

“`bash
ViteRuby::MissingEntrypointError in Tasks#index
Showing /path/to/app/views/tasks/index.html.erb where line #8 raised:

Vite Ruby can’t find entrypoints/tasks.js in the manifests.

Possible causes:
– The last build failed. Try running `bin/vite build –clear –mode=development` manually and check for errors.

Errors:
The

元記事を表示

【Rails】メソッドの中でメソッドを定義したらRuboCopに怒られたゾ

どうもこんにちは。

今回は、Railsでメソッドの中にメソッドを記述してコードを書いた時に、Rubocopに怒られたのでその対処法を紹介します。

Rubocopの導入方法は以下の記事で紹介しています。

https://qiita.com/PDC-Kurashinak/items/1de32b66d95c705f5b82

# 実際に書いたコード

※ こんな感じで書いたという感じで書きます。

“`ruby
def display_calculate_result(x, y, z)
# 足し算メソッドを定義
def add_calculate(a, b)
result = a + b
result
end

# 掛け算メソッドを定義
def multiplication(add_result, c)
result = add_result * c
result
end

# 足し算メソッドを呼び出し
add_result = add_calculate

元記事を表示

三項演算子について

## はじめに
 個人的に「三項演算子」について苦手意識があったので、今回はあえてそれに触れてみます。
## 環境
ruby 3.14

rails 7.0.3.1

## 三項演算子って?
**条件式をif, elseを使わないで書いてしまえるもの。**

複数に渡ってかかなればならないコードも、これを使えば短いコードで済むのですっきりします。

コードにすると次のようになリます。
“`
条件式 ? 正しいとき : 正しくないとき
“`
これをif,elseで書くとすると次のようになります。

“`ruby
if 条件式
正しいとき
else
正しくないとき
end
“`
以上のように短いコードで済むことが分かります。

ではこれはどのような時に使えば良いのでしょうか?

## 例
 作っているもの→ ”ブログを作成するサイト”
 コードを書く場所→ Articleモデル

また
”記事(Article)を『下書き(draft)・公開(published)・公開待ち(publish_wait)』としてstateカラムに分類している状態”

加え

元記事を表示

left_joinを理解する

### はじめに
nilのデータを取得したい時に`LEFT JOIN`を使用すると思います。この時に欲しいデータがうまく取得できず色々やった結果、改めて`LEFT JOIN`を理解しなおすことができたのでメモとして残します。

今回取得したいデータの条件は以下の通りです。

– サブ商品には登録されていないメイン商品、サブ商品から削除された商品も取得

“`sql
MainProductTable(メイン商品)
+—-+————-+——–+
| id | product_name | stock |
+—-+————-+——–+
| 1 | XxxProd1 | 50 |
| 2 | XxxProd2 | 30 |
| 3 | YyyProd1 | 20 |
| 4 | YyyProd2 | 20 |
| 5 | XyxProd3 | 20 |
| 6 | ZzzProd3 | 30 |
| 7 | TttPr

元記事を表示

OTHERカテゴリの最新記事