Rails関連のことを調べてみた2022年12月06日

Rails関連のことを調べてみた2022年12月06日

Rails7で素早く素敵な管理画面を作る【Infold】

# はじめに
Railsエンジニアの皆さん、管理画面作るときはどうしていますか?
ActiveAdminなどの管理画面系Gemを使うのも手ですが、

– DSLでカスタマイズするのが辛い
– 欲しい機能が実現できないことがある
– デザインがあまり好みでない

私個人はこんな理由で、既存のGemは使わず、イチから開発していました。しかし、都度イチから開発するのは非効率ですし、管理画面は共通化できる要素が多いことも特徴です。
そこで、自作フレームワークを作って開発を効率化してきました。この仕組みが私自身の開発を大きく改善できたので、是非みなさんにも共有したいと思い、Gemにして公開しました。

今回はこのGem [Infold](“https://github.com/yamataka22/infold”) の使い方をご紹介いたします。

https://github.com/yamataka22/infold

# どんなツール?

## デモサイト

まずは [デモサイト](“https://demo.infold.dev/admin”) をご参照ください。
このアプリは、 **Ge

元記事を表示

[ActiveRecord]throughアソシエーションのjoinsとthroughを使わないアソシエーションのjoinsを同時にチェーンした場合、同じものと判定してくれないので注意

ActiveRecordには同じjoinsを何度チェーンしても1回しかJOINしないという便利機能が備わっています。
例えば下記のように同じjoinsを3回書いても、実際に発行されるSQLでは1回しかJOINされていません。
この機能は複雑なSQLを作る時にすでにJOINされているかを意識せずに実装できるのでとても便利です。

“`irb
irb(main):016:0> User.joins(:user_books).joins(:user_books).joins(:user_books)
User Load (9.6ms) SELECT `users`.* FROM `users` INNER JOIN `user_books` ON `user_books`.`user_id` = `users`.`id`
“`

次に多対多のモデルをJOINする場合を考えます。
下記のモデルではUserとBookは多対多の関係です。UserモデルにBookモデルをJOINする実装を考えます。

“`ruby
class User < ApplicationRecord has

元記事を表示

Rails7をとりあえず起動するまで

※ 本記事はDMM WEBCAMP mentor Advent Calendar 2022 6日目のエントリーです。

網羅的に紹介する訳ではなく、あくまで僕個人が良いと思ったやり方やオプションについてのみ書いていくのでご了承ください。

## `Rails new`コマンドオプション

おすすめのオプションは以下の通りです。

“`sh
rails _7.0.3_ new app_name -T -c tailwind -d postgresql
“`

– `_7.0.3_`はバージョンの指定。デフォルトが7.0.3になっていれば付けなくても良い
– `-T`はテストをスキップするオプション。テスティングライブラリはデフォルトだと`Minitest`なので`Rspec`を使う場合は付けた方が良い
– `-c tailwind`はCSSライブラリとしてTailwindを指定している。Node.js不要でCSSを勝手に必要な分だけ取ってきてくれる機能が新しく搭載されたので、今回は一番効果を実感できそうなこれを選んだ。
– `-d postgresql`はデータベースにPostgre

元記事を表示

N+1問題を理解する

## N+1問題とは
N+1問題とは必要以上にクエリを発行することによりパフォーマンスを低下させてしまうことです。

例えば“`User : Post = 1 : 多“`の場合を考えます。
Railsで実行すると以下のようになります。
“`ruby
[16] pry(main)> users = User.all
User Load (1.3ms) SELECT “users”.* FROM “users”
[17] pry(main)> users.each do |user|
[17] pry(main)* puts user.posts
[17] pry(main)* end
#
#
Post Load (1.8ms) SELECT “posts”.* FROM “posts” WHERE “posts”.”user_id” = $1 [[“user_id”, 2]]
Po

元記事を表示

コメントアウト雑まとめ(HTML,CSS,JavaSprict,Ruby,Rails)

# はじめに
言語ごとのコメントアウトをその都度、ggることを卒業したいと思いました。
アウトプット兼備忘録として簡素にまとめます。

## HTML
“`index.html

“`
## CSS
“`.css

/* 記述内容 */

/*
改行記述パターン
*/
“`

## JavaScript
“`main.js

//記述内容

/*
改行
記述パターン
*/
//CSSと同じ

“`

## Ruby
“`main.rb
#記述内容

=begin

改行記述パターン

=end

#こっちでも
#大丈夫 個人的にこちらの方がすっきりしてよいと感じます。
“`
## Rails
“`main.html.erb
<%の直後に#を付ける。 <% コード %>であれば<%# コード %>
<%= コード %>であれば<%#= コード %>

私としてはHTMLで親しみのある

.erbでも、こちらでコメントアウトするのが好きだ

元記事を表示

こんなMR(PR)出しちゃダメなんだZ!!

# [転職して半年経ちました](#-転職して半年経ちました)

未経験からエンジニア転職して早くも半年が経ちました。
界隈では未経験転職から1年半〜経って転職ドラフトとかで年収アップしてる方が散見されてきましたが私は今の所、全くそんな兆しは見えません。

今回はそんな自分の恥を晒します。
今までに出してきたMR(マージリクエスト)で
先輩エンジニアの方々にご指摘を頂き、先輩の貴重なリソースを奪ってきた数々の
クソコードのうち、選りすぐりの指摘をランキング形式でお届けします!

ちなみにマージリクエスト(MR)やプルリクエスト(PR)というのは自分のコードを
実際に動いている本番環境やその手前のステージング環境に混ぜてもらう為に
権限を持ったエンジニアに確認してもらう事です。

とても大事な行為ですね!
Github使ってるかGitlab使ってるかで呼び方変わりますがやってることは変わりません。

しょーもない事でパイセン達の時間を割かないように是非この記事を反面教師にして気をつけてください!

では早速見ていきましょう!

## 第

元記事を表示

RailsでITF規格のバーコードを生成する方法

## 前置き
メタップスアドベントカレンダー 5日目ということで投稿させていただきます。
[RailsでITF規格のバーコードを作ろうとした話](https://qiita.com/k5yoshidq/items/2ffad71194fef9df3593)にて一度は断念したITF規格のバーコードの生成が可能だということを上司が発見してくれたので僭越ながら紹介させていただきます。

# ITF規格のバーコードとは
> ITFは、インターリーブド2of5(Interleaved Two of Five)の略で、主に段ボールに印刷されている物流商品コード用のバーコードとして利用されているコードです。
[引用…ITF | バーコード講座 | キーエンス](https://www.keyence.co.jp/ss/products/autoid/codereader/basic_itf.jsp)

余談にはなりますが、今回バーコードの生成にあたり沢山バーコードについて調べたのでその辺りの予備知識的なところが増え楽しかったです。

## 実装
Railsにおけるバーコード生成としてよく聞く`

元記事を表示

mail gem を 2.8.0 にしたら LoadError が出た件

Rails でメールを扱うのに ActionMailer が大活躍するが,この [actionmailer](https://rubygems.org/gems/actionmailer) gem は [mail](https://rubygems.org/gems/mail) という gem に依存している。

mail gem は 2022 年 12 月 3 日にバージョン 2.8.0 がリリースされた。

早速 mail を 2.8.0 に上げたところ,Rails アプリが起動しなくなった。エラーメッセージには

“`
Error: The application encountered the following error: cannot load such file — /usr/local/rbenv/versions/3.1.3/lib/ruby/gems/3.1.0/gems/mail-2.8.0/lib/mail/indifferent_hash.rb (LoadError)
“`

とある。

なかなか原因が分からなかった。「cannot load such

元記事を表示

Railsアプリケーションの認証をdeviseからAuth0にリプレースした話

# はじめに
先日、弊社プロダクトのモチベーションクラウドのマイクロサービス化(認証基盤との接続)に成功しました!

今回は既存のRailsアプリケーションをマイクロサービス化するに当たってdeviseをリプレースした手順を記して、
是非みなさまのRailsアプリケーションのマイクロサービス化の助けになればと思います。

# deviseの削除
Railsのログイン機能といえばRailsチュートリアルにも出てくるdeviseを利用しているプロダクトが多いと思います。
https://github.com/heartcombo/devise

このdeviseはcookieで認証情報を保持して、都度認証を行っています。
そしてdeviseは幾つかヘルパーメソッドがあり、これらの置き換えがメインになると思います。
https://github.com/heartcombo/devise#controller-filters-and-helpers

まずはこのヘルパーメソッドが使われている箇所がないか?を確認して、それらの置き換えを検討しました。
その結果、主に大変だった以下3つの代替方法

元記事を表示

RubyでRot13問題

# 前提
ROT13は、暗号の一種です。
仮に文字列`test`を暗号化すると、13個先のアルファベットである`grfg`に変換されるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264678/ea7d5d7a-5701-764a-c4c0-da707d963a3b.png)

# ROT13をRubyで実装
最初ソースコードを書いた際は、ROT13の変換パターンをhashでまとめて、文章の頭文字だけが大文字という条件下だったため、下記のコードのように大文字の場合だけ`capitalize`を最後当てるようにしてました。

“`ruby
ALPHABET_HASH =
{“a”=>”n”,
“b”=>”o”,
“c”=>”p”,
“d”=>”q”,
“e”=>”r”,
“f”=>”s”,
“g”=>”t”,
“h”=>”u”,
“i”=>”v”,
“j”=>”w”,
“k”=>”x”,
“l”=>”y”,
“m”=>”

元記事を表示

Railsをdockerで動かす(M1)

# 概要

M1チップのMacBook側で、rails6 on Dockerを試しました。
成功時の手順を記録します。

# 前提情報

– M1MacBook

– [Docker Desktop for Apple silicon](https://matsuand.github.io/docs.docker.jp.onthefly/desktop/mac/apple-silicon/) Version 4.15.0

– ruby-3.1.2

# 構築までのメモ

アプリケーション用のディレクトリを切る

“`
mkdir railsapp
cd railsapp
“`

## 基本ファイルを用意

“`
touch Dockerfile
touch Gemfile
touch Gemfile.lock
touch docker-compose.yml
touch entrypoint.sh
“`

./Dockerfile
“`
FROM ruby:3.1.2
RUN apt-get update -qq && apt-get install -y build

元記事を表示

graphql-rubyを2.0.14より前のバージョンでinstallしている場合、validate_max_errorsを設定しよう!

バージョン2.0.14から`rails generate graphql:install`した時に生成される`app_schema.rb`に`validate_max_errors(100)`が追加されるようになりました。

下記がその時のCHANGELOGです。
![スクリーンショット 2022-11-24 22.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/2b413c02-dc47-8ec4-0af9-43236cd364c6.png)
関連する差分は下記です。[[プルリク](https://github.com/rmosolgo/graphql-ruby/pull/4179/files#diff-d3a195a6075da040bb95d191bce5ec24d2d26b24949e858ce09d1c3754e59e60R28)]

“`diff:lib/generators/graphql/templates/schema.erb
+
+ # Stop valid

元記事を表示

param is missing or the value is emptyの解決方法

※ 本記事はDMM WEBCAMP mentor Advent Calendar 2022 5日目のエントリーです。

表題の`param is missing or the value is empty`のエラーなのですが、検索すると次々と見慣れない解決策(ストロングパラメータの`require(:モデル名)`の部分を消す方法)が出てくることで有名です。例えば、以下のような記事が出てきます。
– [【Rails】param is missing or the value is empty:について](https://qiita.com/Takka_Log/items/32dae78d7e3892e7b051)
– [【Rails6】param is missing or the value is empty: postで少し詰まったが無事解決](https://qiita.com/kazuki13070311/items/cdd4917af204e00de001)
– [param is missing or the value is empty: user](https://man

元記事を表示

Fly.ioにデプロイしてみた

**mofmof Advent Calendar 2022** 5日目の記事となります。

株式会社mofmofのkomaです。
Herokuの無料プランが廃止となり、さまざまなPaaSに移行された方も多いのではないでしょうか。
本記事ではPaaSの一つである**Fly.io**へのデプロイ手順やコストについて共有したいと思います。

# Fly.ioとは
ユーザーの近くでフルスタックのアプリとデータベースを実行するためのプラットフォーム(直訳)。
東京リージョンもあるのがうれしいポイント。

# 環境
以下の環境で実際にデプロイを行いました。
– MacOS Monterey V12.6.1
– M1 MacBook Pro

# デプロイ手順

公式ドキュメントにRailsデプロイ手順があるので、こちらを参考に既存Railsアプリケーションのデプロイを行いました。
Dockerfileがなくても、ソースコードをスキャンして自動生成してくれるので同じ手順で進められます。

https://fly.io/docs/rails/getting-started/

まずはFlyを利用するに

元記事を表示

ActiveRecordにおけるattributeの参照

## そもそもActiveRecordとは
Railsが使っているORマッパーです。
これによって、RailsのモデルクラスとDBのテーブルが結び付けられます。
Railsアプリケーション内ではSQL文を書く必要はなく、ActiveRecordに則った書き方をすればいい感じにSQL文が発行されます。

## instance.attributeの形でなぜ参照することができるのか?
例えばfirst_name, last_name, email, password, age属性を持つUserクラスがあるとすると, Railsでは下記のように簡単にattributeを参照することができます。

“`.rb
user = User.last
user.first_name # <= これ user.email # <= これ user.password # <= これ ``` なぜActiveRecordでは、このような参照の仕方ができるのでしょうか。 => ActiveRecordがいい感じにattributeの値を返すインスタンスメソッドを自動で定義して

元記事を表示

Turbo 4: Turbo Streamsで生き生きと

:::note
この記事は[Google翻訳](https://translate.google.co.jp/)の結果を編集したものです。
:::

https://turbo.hotwired.dev/handbook/streams

Turbo Streamsは自己実行する``要素でラップされたHTMLのフラグメントとしてページの変更を配信します。各ストリーム要素はターゲットIDとともにアクションを指定して、その中のHTMLに何が起こるかを宣言します。これらの要素はWebSocket、SSE、またはその他のトランスポートを介してサーバーによって配信され、他のユーザーまたはプロセスによって行われた更新でアプリケーションを有効にします。`imbox`に届いた新しいメールはその好例です。

# メッセージとアクションのストリーミング

Turbo Streamsメッセージは``要素で構成されるHTMLのフラグメントです。以下のストリームメッセージは可能な7つのストリームアクションを示しています。

“`html

元記事を表示

Railsのtag.***形式タグヘルパーについて

従来、Railsのビューでタグを書く場合に、`tag`と`content_tag`の2つを使っていましたが、Rails 5.1では`tag.br`のような新形式のメソッドが登場しています。

## 特徴

引数でなくメソッド形式でタグ名を与えるため簡潔になる、ということと、`tag`と`content_tag`を使い分けずに済む、という点があります。

## ソースコードから仕組みを探る

まず、`tag`メソッドを呼び出した際に、引数が一切なければ`tag_builder`メソッドを呼んで、内部実装である`TagBuilder`のインスタンスを生成します。

つまり`h1`や`p`などのメソッドは、この`TagBuilder`のインスタンスメソッドということになります。とはいえ、全部作っては面倒なので`method_missing`の出番で、どんなメソッド名が来ても同じように処理していきます(`tag.foo`のようなでたらめな名前を指定しても動いてしまいます)。

そして、開きタグと閉じタグがセットになったタグと、``のような閉じタグなしで完結するものの2つがあります

元記事を表示

Railsのパフォーマンスについてpumaのスレッド数などをECS のオートスケールなども考慮して調整した話

Railsで作っているwebAPIから、以下のようなエラーが頻発するようになりました。

“`
ERROR — : [77b6b755-3175-4319-b7c6-b7e5b8e00cca] could not obtain a connection from the pool within 5.000 seconds (waited 5.176 seconds); all pooled connections were in use
“`

全てのプール接続が使用中でしたという趣旨のエラーで、どう言うことなのだろうかと悩みましたが、原因は、「同時にアクセスしてきたリクエストのうち、Rails側で許容しているプール数の上限に達してしまい、捌ききれないリクエストが発生していた」でした。

勿体無いことに、RDSのマックスコネクションは理論値で1000カウントまでいけたのに、Rails側ではデフォルトの設定値の5のままになっていて、同時アクセスを5までしか受け付けられないようになっていました。

アプリケーションサーバーの設定の効率化について考えて、アプリのパフォーマンスをよくし

元記事を表示

Hotwireで検索機能を作ってみる

Rails7 でデフォルトとなった`Hotwire`を使って、検索機能を作ってみようと思います。
今回の完成形はこんな感じです。jsは使いません!
![eee.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2322836/4294e854-bd53-edf0-eae9-33f2adf38728.gif)

## Hotwireとは

モダンなWebアプリケーションを構築するための代替アプローチです。
シングルページアプリケーション(以下SPA)を作る時に React や Vue が選択肢に上がると思いますが、それとは別のアプローチを取ります。
以下のような特徴があります。

### Hotwire は複数のライブラリから構成されている

Hotwireは`HTML OVER THE WIRE`の略称で、以下の複数のライブラリをまとめた概念になります。

– Turbo
– Hotwire の核となるライブラリ
– Turbolinks の後継者で3つの技術で構成されている

元記事を表示

【超簡単】Rails 公開・非公開投稿 実装方法

# はじめに
Twitterライクのようなアプリを作成してみたが、投稿を公開・非公開できるようにしたい・・・!という人に向けて執筆します!

# 完成形
下記の写真のように、公開非公開ボタンを作成し、公開を押して投稿すると全員にその投稿が表示され、非公開を押して投稿すると全体には表示されないが、マイページに自分だけが見れる投稿が作成される仕組みを作ります!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/5130136f-2606-005c-a98a-9632b959b850.png)

# 公開か非公開かを判定するためのカラムを追加しよう!
“`ターミナル
rails g migration AddreleaseToテーブル名 release:integer
“`

“`ターミナル
rails db:migrate
“`
該当するコントローラーの最後の方の行にparams〜とあると思います!
そこに,:releaseをつけたそう!
“`rb:コントローラー

元記事を表示

OTHERカテゴリの最新記事