- 1. ActiveRecord::Reflection で Model 間の関連付け情報を取得する
- 2. Rails + Vue.js:ドキュメントのロード完了後にVueアプリをマウントする方法
- 3. 【ruby】 nil を渡さない 返さない
- 4. viteとimportmapの競合による期待しないHTTPメソッドの挙動の解消について
- 5. Railsで画像を保存するメモ
- 6. 【Rails】bundle install時のmysql2エラーの解消方法
- 7. Ruby on Railsのモジュラーモノリス化を推し進めるpacks-railsというgemがすごいという話📦
- 8. Ruby on Railsでコントローラー名と紐づいているもの
- 9. DeviseとCanCanCanを併用したセキュリティ保護
- 10. Rails DM機能の実装
- 11. webサーバーはフレームワークに組み込まれている
- 12. Parallel gemで実装した処理をRspecでは同じスレッド上で動かす
- 13. Dockerイメージサイズを劇的に削減する方法【Rails7】
- 14. Railsのscopeの良くない書き方
- 15. SDK for Rubyを使用してS3で署名付きURLを発行し、ブラウザにてダウンロードを行う。
- 16. Rails 7 と Vite: Uncaught TypeError 解決策
- 17. 【Rails】少しだけ楽!Bootstrapのモーダルを使って通知機能を作成する(いいね・コメント・フォロー)
- 18. Dockerで環境構築(Rails7+mysql)
- 19. 【Rails】環境変数で条件分岐するときの小ネタ
- 20. Dockerを使ったRailsとNext.jsの開発環境の構築
ActiveRecord::Reflection で Model 間の関連付け情報を取得する
株式会社学びと成長しくみデザイン研究所の藤澤です。
## はじめに
Rails の各 Model 間の関連付けの情報を実装上で取り扱うにあたり、ActiveRecord にはそれを取り出すためのメソッドとその情報を管理するクラスが用意されています。
今回は、以下のような Model を例に説明を進めていきます。
“`rb
# 1つのAuthorに複数のBookが紐付き、1つのBookに複数のPageが紐づく。
# Author の主キーは code で、Book における外部キーは author_code。
class Author < ApplicationRecord self.primary_key = :code has_many :books, foreign_key: :author_code end class Book < ApplicationRecord belongs_to :author, foreign_key: :author_code has_many :pages end class Page < ApplicationRec
Rails + Vue.js:ドキュメントのロード完了後にVueアプリをマウントする方法
RailsとVue.jsを組み合わせたアプリケーション開発では、ページのDOMが完全にロードされてからVueインスタンスをマウントすることが重要です。特にRailsのビューで`javascript_pack_tag`や`vite_javascript_tag`を使う際にこの問題は顕著になります。この記事では、DOMのロード完了を待ってからVueアプリケーションをマウントする方法と、そうしない場合の違いについて解説します。
## `DOMContentLoaded` を使用する理由
“`javascript
document.addEventListener(‘DOMContentLoaded’, () => {
const calendarEl = document.getElementById(‘weekly-calendar’);
if (calendarEl) {
createApp(WeeklyCalendar).mount(calendarEl);
}
});
“`上記のコードでは、`DOMContentLoaded` イベントリスナーを使用し
【ruby】 nil を渡さない 返さない
## はじめに
最近、コードレビューで「なるほど~⭐️」と思うことがあったので備忘録としてまとめようと思いました。
それは、**プリミティブな `nil` を返却するとそれ自体が意味を持ち始め、コードの意図が伝わりにくくなる**というものでした。## nilを返したくない理由
– ロジックの至る所で`nil`を意識した設計になり、コードを読む時や機能追加する時に **`nil`が返却されるかどうかの丁寧な確認が必要** になるのでだるい– `nil` が返されることで**条件分岐が発生し、可読性の低いコードを書いてしまいがち。**
– **「nilが返却される」 というのが一種の暗黙的な仕様になる。**
## nil を返すことで引き起こされる悲劇
では悲劇が起こる前…
タスクと1週間のタスクを管理するようなクラスがあるとします。
“`ruby
#
# タスククラス
# 何曜日に実行されないといけないか知っている
#
class Task
TODO = ‘todo’
DOING = ‘doing’
DONE = ‘done’attr_
viteとimportmapの競合による期待しないHTTPメソッドの挙動の解消について
# Rails 7 でのログアウト処理問題とその解決策
Railsアプリケーションで以下のようにログアウトリンクを設定している場合、
“`erb
<%= link_to 'ログアウト', destroy_user_session_path, data: { turbo_method: :delete } %>
“`次のエラーに直面することがあります。
“`bash
ActiveRecord::RecordNotFound at /users/sign_out Couldn’t find User with ‘id’=sign_out
“`Rails 6 では以下の方法でログアウトリンクを記述していましたが、
“`erb
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
“`Rails 7 からは `data: { turbo_method: :delete }` を使用する必要があります
※そうしないとGETメソッドで予期しないリンク先に遷移しようとします。
しかし、この
Railsで画像を保存するメモ
## ソースコード
“`ruby
def create
# 登録用
product = Product.new(name: params[‘name’], price: params[‘price’], description: params[‘description’])if params[:image]
extension = File.extname(params[:image].original_filename)
random_filename = SecureRandom.uuid + extension
product.image = random_filename
image = params[:image]
File.binwrite(“public/products/#{product.image}”, image.read)
else
product.image = “defalut.png”
endif product.save
【Rails】bundle install時のmysql2エラーの解消方法
# 概要
ローカルの Ruby on Rails で `bundle install` を実行したときに、mysql2のインストールで以下のエラーが出てしまうことがあります。“`ruby
Installing mysql2 0.5.6 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.# (略)
Gem files will remain installed in
/Users/watasho/study/batch_sample/.bundle/ruby/3.2.0/gems/mysql2-0.5.6 for inspection.
Results logged to
/Users/watasho/study/batch_sample/.bundle/ruby/3.2.0/extensions/arm64-darwin-22/3.2.0/mysql2-0.5.6/gem_make.out# (略)
An error occurred whi
Ruby on Railsのモジュラーモノリス化を推し進めるpacks-railsというgemがすごいという話📦
こんにちは、akitoshigaです。
現在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