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

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

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:コントローラー

元記事を表示

AWS Protonで使い捨てのブランチプレビュー環境を実現する

この記事は 「[AWS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/aws) その1」の5日目の記事です。

https://qiita.com/advent-calendar/2022/aws

# AWS Proton

今年はProtonさんのおかげでインフラ周りをスッキリ快適にさせることが出来て、本当にProtonさんさまさまでした。
本番とステージング環境は実際にProtonで稼働しており、問題なく運用できております。
こちらの記事の頃よりも改良が進んでいて、ステージング環境用のDBを課金少な目構成にしたり、ECS ExecでFargateに入れたりなどできるようになってきて、結構楽しいです。

https://qiita.com/goosys/items/ef66274663b3552be36f

https://qiita.com/goosys/items/28606473d3622900b3c2

今回は、最初にProtonを知ったときにこういうことできたらいいなと思っていたものを作っていこう

元記事を表示

【Rails devise】Couldn’t find User with ‘id’ = sign_out

# 状況
Rails6でdeviseを使用していると、以下のようなエラーが表示されログアウトができなくなることがある。
“`
Couldn’t find User with ‘id’ = sign_out
“`
このエラーに掛かっている人はおそらく、ログアウトのメソッドとして以下のようにDELETEを指定しているだろう。
“`erb
<%= link_to'ログアウト', destroy_user_session_path, method: :delete %>
“`
しかし、DELETEを指定していてもメソッドがGETになってしまうことがあるようだ。(この詳細は私には分かりかねるのでご了承いただきたい。)

対処法には大きく以下の二つがある。

# 対処法① ルーティングを設定する
ルーティングを以下のように設定し、GETリクエストをdestroy Actionへ渡す。
“`ruby:config/routes.rb
devise_scope :user do
get ‘/users/sign_out’ => ‘devise/sessions#destroy’
end

元記事を表示

【Ruby on Rails】 sqlite3 から mysql に切り替える

## はじめに
Ruby on Rails で デフォルトのデータベースが sqlite3 になっていますが、mysql に切り替えたいと考え、備忘録としてアウトプットします。
## サービス環境
– ruby 3.0.0
– Rails 6.0.4
– docker
– mysql 8.0.2
– Slim, SCSS

## 方法
### 1. Gemfileの編集
“`
# gem ‘sqlite3’, ‘~> 1.4’
gem ‘mysql2’
“`
デフォルトの sqlite3 の gem はコメントアウトし、mysql2 を追記します。
### 2. bundle install
### 3. コンテナの再度立ち上げ
### 4. config/database.yml編集
“`yml
default: &default
# adapter: sqlite3
# pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
# timeout: 5000
adapter: mysql2
encoding: ut

元記事を表示

Rails 7にOmniAuthでTwitterログイン機能を搭載

# はじめに

10年ほど前にOmniAuthでTwitterログインをするという機能をいくつかのシステムで実装したのですが、久しぶりに同じことをやってみようとすると時間がかかってしまったので、今回実施した内容をまとめておくことにしました。

以下のバージョンで動作を確認しています。deviseとは連携しないでOmniAuth単体でユーザー認証をします。

– Ruby 3.1.2
– Rails 7.0.4
– OmniAuth 2.1.0
– OmniAuth::Twitter2 0.1.0

# ライブラリのインストール

TwitterのAPIがv2になっていたので、それに対応したStrategyのライブラリを利用します。

https://github.com/unasuke/omniauth-twitter2

“`ruby:Gemfile
gem “omniauth-twitter2”
gem “omniauth-rails_csrf_protection”
“`

“`bash
% bundle
“`

# Client ID, Client Secretの取得

元記事を表示

[Rails]ページの閲覧数をカウントする方法

## 考え方
ER図はこちら
作成するモデルは**ReadCount**のみです
![ER図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2950107/aadc0815-d6f2-038d-d652-fae30956ded3.png)

各Bookのshowページにアクセスした時に以下の処理を行う
・本のidと訪れたユーザーのidをReadCountに登録する

閲覧数を表示するには
・該当するBookを探す Book.find(params[:id])等
・アソシエーションを用いて該当するbook_idを持つReadCountのデータを数える
例:book_idが1の場合
book.find(1).read_counts.count

前提条件
ruby 3.1.2
Rails 6.1.7
device、bootstrap導入済み(bootstrapは見た目の問題なので機能には関係なし)
User及びBookモデル作成済み

# 1.モデルの作成

integer型か、既存のテーブルを参照するr

元記事を表示

Rubocop導入

### Rubocop導入
“`Ruby:Gemfile
group :development do
gem ‘rubocop’, require: false
end
“`
“`Terminal:ターミナル
bundle install
touch .rubocop.yml
“`

“`Ruby:.rubocop.yml
AllCops:
# 除外するディレクトリ(自動生成されたファイル)
# デフォルト設定にある”vendor/**/*”が無効化されないように記述
Exclude:
– “vendor/**/*” # rubocop config/default.yml
– “db/**/*”
– “config/**/*”
– “bin/*”
– “node_modules/**/*”
– “Gemfile”

# 1行あたりの文字数をチェックする
Layout/LineLength:
Max: 130
# 下記ファイルはチェックの対象から外す
Exclude:
– “Rakefile”
– “spec/rai

元記事を表示

相互フォロー間のユーザー同士でDMを送る方法

忘備録、並びに考え方の整理として投稿します
初学者なので効率的なコードの書き方などは出来ていないかと思います。

今回の目的
相互フォローをしているユーザー間でDMを送り合いたい

前提条件
ruby 3.1.2
Rails 6.1.7
device、bootstrap導入済み(bootstrapは見た目の問題なので機能には関係なし)
User及びフォロー・フォロワー機能作成済み

ER図は下記のようになります
作成するのはこの内**UserRoom**, **Room**, **Chat**の3つ
ER図_8a.png

# 1.モデルの作成
integer型か、既存のテーブルを参照するreferences型のどちらかで記述
references型では若干書き方が違う( 〜_idが不要になる)ので注意

元記事を表示

Ruby・Node.js・Goのライブラリバージョン管理比較

## 対応表

| | Ruby | Node.js | Go |
|:-:|:-:|:-:|:-:|
| 言語バージョン管理 | rvm, rbenv

<例>
rbenv install 3.0.0 && rbenv local 3.0.0 #=> 3.0.0 (set by /Users/yokoto/.rbenv/version)| nvm, nodenv, n

<例>
nvm install 19.2.0 && nvm use 19.2.0 #=> Now using node v19.2.0 (npm v8.19.3) | go, goenv

<例>
go install golang.org/dl/go1.18.8 && go1.18.8 download #=> go version go1.18.8 darwin/arm64 |
| パッケージ管理ツール | Bundler

<例>
gem install bundler && bundler -v #=> Bundler v

元記事を表示

OTHERカテゴリの最新記事