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

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

PumaやSidekiqでメモリが肥大する問題の対処法

RailsアプリケーションでPumaを使ったり、非同期処理のためにSidekiqを使うことはよくあると思います。
アプリケーションを長期運用しているとPumaやSidekiqのメモリ使用量が肥大しOOM Killerにプロセスを殺されたり。なんてことがよく起きます。

# 原因
メモリ使用量が肥大化する原因の一つとして、Rubyのメモリ管理とmallocの仕様(スレッド単位メモリアリーナ)によりメモリの断片化が発生していることが挙げられます。

メモリの断片化であって、メモリリークしているわけではありません。

## 解決策1. Puma Worker Killerを使う
Puma Worker KillerというGemがあります。
PumaのWorkerプロセスが設定したメモリを超えた時に自動でそのプロセスを殺して安全に再起動することでメモリの肥大を防ぎます。
**根本的な解決ではありませんが、環境をいじれない人にとってや有効かもしれません。**
ただPumaのみの解決であってSidekiqの解決にはなりません。

https://github.com/schneems/puma_w

元記事を表示

【Rails】画像の複数登録+プレビュー表示

メルカリのクローンサイト作成にあたり、商品出品ページを実装しました。
今回は、画像登録に関する備忘録です。

# ゴール
![Alt text](https://gyazo.com/898339aeaf5b35bc135f8494dce8f0cc/raw)

**・** 画像をDBに登録する前にプレビュー表示
**・** 画像は最大10枚まで登録可能
**・** 1〜5枚目までは上段、6〜10枚目までは下段に表示させる
**・** 画像は最低1枚以上登録しないと商品出品できない
**・** プレビュー画像を1枚ずつ削除
**・** DBに保存済み画像があればページアップロード時に表示させる

# 実装の考え方
– 画像を1枚アップロードするごとに、新たにinputタグとimgタグを生成
– プレビューとinputタグに同じ番号を振って管理する。
– プレビュー画像と削除ボタンをセットで実装し、削除ボタンをクリックしたら、その番号を持つinputタグを削除する
– DBに保存済み画像にも、削除ボタン、番号を振ったプレビューの表示を行う。

※imgタグの管理番号の整理方法 :

|属性

元記事を表示

Rails に LivenessProbe 用のコントローラーを作る

ハラ 二 シボウ ガ タマッテキマシタネー

# 定期健康診断をうけさせられる
とある会社のクラウドシステムにはヘルスチェック機能がついて、Kubernetes の LivenessProbe に監視させていると、ロードバランサーにアクセスさせないという方法がとれる。しかしながら、その機能を使うにはデフォルトの設定だと URI のルートを参照するので、ホームページに下手に DB や キャッシュなんかを多用している場合は DDoS を受けているのと変わらない状態になってしまう。そんなことにならないように、今回はヘルスチェック専用のコントローラーを作って、動いているのをチェックさせたい。

# コード
今回のコードは [Github のレポジトリ](https://github.com/seahal/qiita) にアップロードしてあります。
### Routing
“`ruby
Rails.application.routes.draw do
resource :health_check_up, only: [:show]
end
“`
DHH が REST を活用しろ、とのこ

元記事を表示

Docker ComposeでRuby2.7+Rails6.0+MySQL8.0の環境を用意してrails newする

下記を参考に、より簡易的な Docker 環境で rails new から rails server が起動するまでの流れをまとめます。

> クジラに乗ったRuby: Evil Martians流Docker+Ruby/Rails開発環境構築(翻訳)
> https://techracho.bpsinc.jp/hachi8833/2019_09_06/79035

※ DB に MySQL を使っている点や、rails new (アプリケーション作成時) から始める点、設定が簡易的になっている点がリンク先とは違います。

# 作業ディレクトリ用意
“`bash:terminal
$ mkdir myapp
$ cd myapp
“`

# Docker 関連ファイルの作成
“`plaintext:ディレクトリ構造
myapp/
├── Dockerfile
└── docker-compose.yml
“`

“`yml:docker-compose.yml
version: ‘3.7’

services:
backend:
build: .
stdi

元記事を表示

ERROR! The server quit without updating PID file (/usr/local/var/mysql/mba.pid).の解決策

# バージョン

– Ruby 2.6.3
– Rails 6.0.2.2
– Homebrew 2.2.14
– MySQL 8.0.19

# mysql.server startをするとエラーが出る!

“`
$ mysql.server start
Starting MySQL
. ERROR! The server quit without updating PID file (/usr/local/var/mysql/mba.pid).
“`

PIDファイル?がねえよ!
と怒られちまったぜ、へへへ

↓の記事を参考に進めてみる
https://qiita.com/_natsu_no_yuki_/items/ae4c94187093e4ab3cdc

PIDファイルをチェック↓
mbaのところは自分のパソコンの名前が入るよ
(僕はMacBookAirを使ってるので略してmbaにしてます。単純でしょ?)

“`
$ ls -la /usr/local/var/mysql/mba.local.pid
ls: /usr/local/var/mysql/mba.local.p

元記事を表示

【Rails 忘備録】devise_viewを編集しても反映されない問題

#はじめに
「Ruby on Rails」の「devise」を使ってユーザー新規登録/ログイン機能を実装する際、viewを編集しても一向に反映されない問題が発生しました。表示はされることからエラーでもなさそうなため追う術もありません。これを回避するために小技や、devise特有の注意点があることがわかったため、備忘録として残します。

#現象
deviseをインストールし、ビューを「rails g devise:views Model」で作成すると、以下のデフォルトのビューが表示されます。
私の場合は Model = devise で作成しました。
この状態からビューの編集を始めたのですが、どれだけ編集して、どれだけ対策を打ってもデフォルトのビューが表示されるというループにハマりました。

![d9640d67d8f66a838477e89051d5f715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/516379/93dc63f5-36e0-27ee-1b22-0f1a22e858fa.png)

元記事を表示

An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.の解決策

# それぞれのバージョン

– Ruby 2.6.3
– Rails 6.0.2.2
– Homebrew 2.2.14
– MySQL 8.0.19

# bundle installでエラーが出る!

“`
$ bundle install
The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock –add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/……..

元記事を表示

railsで一部pathをサブドメインにする(メモ)

# 実装方法
`constraints subdomain: ‘hoge’`でいける

“`ruby
constraints subdomain: ‘hoge’ do
# …
end
“`

## ローカルで開発をする場合
`vi /etc/hosts`で設定ファイルを開き、`localhost:3000`にサブドメインを設定する必要がある

“`
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##
127.0.0.1 localhost
255.255.255.255 broadcasthost
::1 localhost

127.0.0.1 hoge.localhost.local
“`

hostファイルの127.0.0.1の行に自分で設定したいサブドメインを記述
(`hoge.localhost`だとなぜ

元記事を表示

GoogleBooksAPIだけで本リソースの取得をする設計を行い、失敗した話

## 対象読者

– 本に関するRailsのポートフォリオを作っている方々
– Google Books APIを用いたポートフォリオを作っている方々

外部APIによるリソースを使ったサービスのシステム設計に関する話です。

## 元々の設計

– users, books, likesの3つのテーブルがありました。
– booksの情報はGoogle Books APIから取得し、いちいちbooksテーブルに保存する設計にしていました。

![book_db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496036/64d41402-1a89-c481-7313-b99f17d244b2.png)

##### likesテーブル

| id | user_id | book_id |
| —- | —- | —- |
| 1 | 1 | 1 |
| 2 | 1 | 5 |
| 3 | 2 | 1 |
| 4 | 2 | 4

元記事を表示

【seed】rails db:seedで db/seeds.rb以外を読み込む場合

#問題
db/seeds/product_suggest.rbに配置してあるデータ

“`ruby
[
‘toothbrush’,
‘tooth paste’,
‘eye drops’,
‘water’,
‘tape’,
‘eraser’,
‘pencil’,
‘shirt’,
‘t-shirt’,
‘towel’,
].each do |keyword|
Product::Suggest.create!(keyword: keyword)
end
“`
こちらを、テーブルに読み込ませたいが、今まではdb/seeds.rbに記述したテータのみしか読み込ませた事がなかった。
この場合どのように設定するか検索し、対処した。

#検証環境
“`shell
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.3
BuildVersion: 19D76
“`
“`shell
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_

元記事を表示

Rails6のActionMailer機能をRSpecでテストする方法

# はじめに
皆様、こんにちは!
佐久間まゆちゃんのプロデューサーの@hiroki_tanakaです。

私は現在、Railsを使用してメール送信機能を持つシステムを構築しているのですが、
Railsの持つActionMailer機能のRSpecでのテスト実装を少し調べたので紹介させて下さい。

記事の流れとしては、最初に利用環境とActionMailerを使うための下準備に触れ、
その後に実際のActionMailer側のコードとRSpecのコードを記載致します。

# 利用環境
Ruby 2.6.6
Rails 6.0.2
RSpec 3.9.1

# 下準備
今回は[mailgun](https://www.mailgun.com/)をESP(Email Service Provider)として、メール送信を行います。
そのため、mailgunで行った設定を`development.rb`に記載をして、rails側でmailgunを使用出来るように設定をします。
ActionMailerのRSpecテストだけ行う場合は本設定は不要ですが、メール送信機能を通常のアプリケーション側か

元記事を表示

三項演算子について

railsチュートリアルにやたらと出てくる、三項演算子についてまとめてみました。

***
“`
if @current_user.nil?
@current_user = User.find_by(id: session[:user_id])
else
@current_user
end
“`

上記のコードを三項演算子に書き換えると、

“`
@current_user = @current_user || User.find_by(id: session[:user_id])
“`

さらに書き換えると、

“`
@current_user ||= User.find_by(id: session[:user_id])
“`
||=の形なんだかみたことあるな〜と思ったら、コラムに以下の説明を見つけました。

“`
x = x + 1 -> x += 1
x = x * 3 -> x *= 3
x = x – 8 ->

元記事を表示

Dockerでgit commit時に静的解析をする

### はじめに
静的解析ツールを使って、コーディング規約に沿ってコーディングされているかを解析できます。
そして、その解析をコミット時に行い、規約違反していたらコミットできない`pre-commit`というGemがあります。
今回は、その設定でつまづいたのでここに残しておきます。

参考にしたのはこちらの記事です。
[rubocop + pre-commitで規約違反のコードをコミットできないようにする](https://ohmyenter.com/rubocop-with-pre-commit/)

### Gemの導入

今回、`rubocop-airbnb`という規約が決まっているgemを導入してみました。

`rubocop-airbnb`の使い方は[こちら](https://qiita.com/tmyn470/items/751511335b44aef2ecad)を参考にしてください。

“`
group :development do
gem ‘pre-commit’
gem ‘rubocop-airbnb’
end
“`

gemをインストールします。

元記事を表示

railsのspina cmsにwebpを導入する。

railsのspina cmsはtrix editorを使っています。
画像などはリサイズとかしてくれません。
そこでこの記事ではリサイズと圧縮(webp)を使う方法を書きます。
webpが使える環境構築は適当に調べてください。

まずは実際のコードはこんな感じです。

“`ruby:app/model/spina/text.rb
module Spina
class Text < ApplicationRecord extend Mobility translates :content, fallbacks: true has_many :page_parts, as: :page_partable has_many :layout_parts, as: :layout_partable has_many :structure_parts, as: :structure_partable before_save :webpify def webpify doc = Nokogiri::HTML.parse(s

元記事を表示

ActionTextの問題とその解決策としてのactive_storage_variant_records

`has_rich_text :content`これで文章、画像などもcontentカラムに埋め込めるわけですが、
生のcontentのデータはhtml(imgタグなど)そのものではなく、画像などの埋め込み情報(どのテーブルのどのidなのか)を持っているだけです。
そして生のhtmlコードを作るには`content.to_s`を呼ぶ必要があります。

“`ruby
def full_content
self.content.to_s
end
“`
こういうコードを書いてる人も多いでしょう。

1つのレコードの1つのcontentカラムに多数の画像を埋め込むこともあります。
1記事に20枚の画像があれば、20の画像(blob)インスタンスが作られます。
そして各画像をvariantでリサイズ、圧縮やwebpなど生成している場合は、
`content.to_s`が呼ばれると、20回、variantが存在するのかを確認しにいきます。
“既にvariantが存在する”というフラグなどをテーブルに突っ込めばいいのに、毎回gcpやawsなどにアクセスします。
1回あたり40msくらいかかり

元記事を表示

Rails コントローラのコンストラクタでは super を呼ぼう

Ruby では他の言語におけるクラスのコンストラクタにあたる処理を `initialize` メソッドとして定義します。([initialize のリファレンス](https://docs.ruby-lang.org/ja/latest/method/Object/i/initialize.html))

Rails では典型的なコントローラを ApplicationController の派生クラスとしてつくります。そのため、コントローラの初期化を `initialize` で実装すると基底クラスの `initialize` をオーバーライドすることになります。([ApplicationController のリファレンス](https://www.rubydoc.info/docs/rails/Rails/ApplicationController))

リファレンスにあるとおり、ApplicationController は

“`
Object
^
AbstractController::Base
^
ActionController::Metal
^
ActionContr

元記事を表示

unexpected keyword_ensure, expecting end-of-input ensure

単純ミスなエラー表記。
コード記載の中で文法に問題箇所があるということでした。

今回でいうと<% end %>が余分に一つ作ってしまっていました。

元記事を表示

子テーブルの値を where 絞り込み Rails

#where句で値の絞り込み
Railsで子テーブルのカラム名で where 絞り込みを行う方法です。

“`
User.joins(:posts).where(posts: {work_in_progress_flag: true})
“`

上記の様に、
where句内で、ハッシュ形式で記述することで
子テーブルの値で絞り込みを行う事が出来ます。

“`
where(子テーブル名: {カラム名: 値})
“`

#参考
>Railsガイド Active Record クエリインターフェイス
https://railsguides.jp/active_record_querying.html#%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E6%9D%A1%E4%BB%B6

Railsガイドは大事

元記事を表示

【Rails API 入門】devise-token-auth

# はじめに
### devise-token-auth とは?
Railsにおける**トークン認証**を実現するgemです。

この`devise-token-auth`を用いることで、新規登録、ログイン・ログアウトなどはもちろんのこと、アプリ各種操作を行う時に`header`情報にユーザーの認証情報(トークン)を載せてバックエンド側(RailsのAPI側など)に送ることで、毎回の処理を安全に実行することができます。

– [GitHubリンク](https://github.com/lynndylanhurley/devise_token_auth)
– [詳細解説ページ](https://devise-token-auth.gitbook.io/devise-token-auth/)

そこで今回は、**RailsでAPI提供を行う際の devise-token-auth の使い方**について解説します。

### トークン認証 とは?
簡単に言うと、ログイン・ログアウト、新規登録などのユーザー認証を行う方法の1つで、トークンと呼ばれるしるし(トークンの英語訳)のようなものを利

元記事を表示

【Rails】I18n::InvalidLocaleData ロケールファイルを翻訳できない

# 概要

“`ruby:application.rb
config.i18n.load_path += Dir[Rails.root.join(‘config’, ‘locales’, ‘**’, ‘*.{rb,yml}’).to_s]
“`

複数ロケールファイルを読み込ませる設定を記述しているが複数ロケールファイルを作成するとエラーがでる。

## エラーメッセージ

[view]
[![Image from Gyazo](https://t.gyazo.com/teams/startup-technology/f7339860047d9f79f282a00aa23b51a1.png)](https://startup-technology.gyazo.com/f7339860047d9f79f282a00aa23b51a1)

[log]

“`ruby:development.log
I18n::InvalidLocaleData – can not load translations from /Users/hogehogehoge/hogehoge/hogehoge

元記事を表示

OTHERカテゴリの最新記事