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

Rails関連のことを調べてみた2022年01月04日
目次

「heroku run rails db:migrate:reset」時に発生したエラーを対処

# 状況

Heroku上のRailsアプリDB(PostgreSQL)を修正しようと`heroku run rails db:migrate:reset`を実行したところ下記のエラーが発生しました。

“`irb
rails aborted!
ActiveRecord::ConnectionNotEstablished: connection to server on socket “/var/run/postgresql/.s.PGSQL.5432” failed: No such file or directory
Is the server running locally and accepting connections on that socket

Caused by:
PG::ConnectionBad: connection to server on socket “/var/run/postgresql/.s.PGSQL.5432” failed: No such file or directory
Is the server running lo

元記事を表示

Railsで条件に一致する要素の個数を数え上げる時のコードのリファクタ例

railsで作られているアプリで、countを使用する機会があったので、具体例として書きました。
countを知らない人はググってみてください。

“`ruby
class User
has_many :qualifications # 資格証
end

class Qualification
has_one_attached :image # 画像
end
“`
例えばこんなクラスがあったとして、あるuserが持っているqualificationsのうち、
imageが添付されているものの個数を数えたい場合を考えます。

私はまず以下のように書きました。

“`ruby
attached_count = 0 # 添付されているものの個数を入れる変数
user.qualifications.each do |qualification|
attached_count += 1 if qualification.image.attached?
end
“`
このコードでも、あるuserの、imageが添付されているqualification

元記事を表示

【Rails 6】1つのコントローラー、ビューで複数モデルに対応した汎用性高めのCSVインポート機能を作る

## 概要

先日、Rails でとあるサービスを作っている際に「〇〇 と △△ と □□ 〜 の CSV インポート機能を作ってくれ」といった要望を一度にたくさん受けたのですが、単にモデルの数だけ同じようなコードがダラダラと増えるのも嫌だなぁと思い何か良さげな書き方が無いか探していたところ、そこそこ汎用性の高そうなコードができたので紹介します。

![csv-importer (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/86fcfd44-822a-15fa-b0f4-60020b13577a.gif)

**主な内容**

– 1つのコントローラー、ビューで複数モデルの CSV インポートに対応
– データ挿入前にプレビュー画面を挟み、取り込み予定データの内容を確認可能
– CSVファイルの中身に問題があった場合、何行目のどこが悪いかを表示

全体的に “Dry” かつコンパクトに、たとえ後に対象のモデルが増えたとしてもなるべく少量の追記で対応できるように心がけました。

##

元記事を表示

最小限のテスト容易性を確保するための一提案

## 要約

* システムの保守性をあげるために自動テストを書くのは良いアプローチといえる
* しかし自動テストを書く時間がなかったり書くスキルがないメンバがいるという諸事情はよく発生する
* そうした時は最初(書き始め)のタイミングで、テスト対象のクラス・メソッドの処理を最後まで処理が通る1ケースだけ書こう
* このアプローチはシステムの保守性をあげるだけではなく、個人・メンバのスキルアップにも繋がることがある

## テスト容易性とは

* [テスト容易性をGoogleで調べる](https://www.google.com/search?q=%E3%83%86%E3%82%B9%E3%83%88%E5%AE%B9%E6%98%93%E6%80%A7)と難しそうな話が出てきますが、本記事では **テストがしやすい** というふんわりとした言葉の意味合いで使っていきます
* テスト容易性はシステムの保守性を支える1要素ともいえ、このテスト容易性を高めることでシステムの保守性を少しでも高めることができるものです。(もちろん銀の弾丸ではありません)
* [質とスピード](https:

元記事を表示

【Rails】画像アップロードにcarrierwave

## CarrierWaveとは
Rubyのアプリケーションから簡単にファイルをアップロードするためのgemです。

## 開発環境
mac
ruby: 2.6.4
rails: 5.2.6
db: mysql

## 注意事項
本記事は、ローカルで作業する前提となります。
Gem追加後は読み込みの為にサーバーの再起動をしてください。
Carrierwaveのバージョンが2.0の場合は、Rails 5.0以上・Ruby 2.2以上が必要との事なので注意して下さい。
詳しい内容は下記の公式サイトから参照してください。
[carrierwave](https://github.com/carrierwaveuploader/carrierwave)

## 導入手順
– Gemfileにcarrierwave追加後インストール

“`ruby:Gemfile
gem ‘carrierwave’, ‘~> 2.0’
“`
“`linux:ターミナル
% bundle
“`

– 下記のコマンドでアップローダークラスを生成します。

“`linux:ターミナル
%

元記事を表示

railsのwrap_paramerterがやっている事と設定の方法について

# wrap_paramerterとは

コントローラーの名前からリソースの名前を推測してリクエストパラメータをリソースの名前でラップする仕組みの設定を行います。

https://railsguides.jp/action_controller_overview.html#json%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF

rails6.1までのrailsアプリケーションでは`rails new`した際に`config/initializers/wrap_parameters.rb`というファイルが作成されます。

“`ruby:config/initializers/wrap_parameters.rb
# Be sure to restart your server when you modify this file.

# This file contains settings for ActionController::ParamsWrapper which
# is enabled by default.

# Enabl

元記事を表示

【Rails】devise_token_authから送るメールの件名を変えたい!

devise_token_authから送るメールの件名を変えた”い!

ユーザー作成時やパスワードリセットなどのdevice_token_authの機能を使用した際に、Email送信がされるものがありますね。

そのメールの件名がバリバリ英語なので、自分のアプリに合うような最高な件名に変えた”い!

その方法について簡潔に記していきます。

変更方法

方法はいたってシンプル!

config/locales/devise.en.ymlを開いて、自分が変えたいところのsubjectを変えるだけ!

“`yml:devise.en.yml
# Additional translations at https://github.com/heartcombo/devise/wiki/I18n

en:
devise:
confirmations:
confirmed: “Your email address has been successfully confirmed.”
send_instructions: “You

元記事を表示

shallowオプション

##shallowオプションとは
ルーティングの記述を複雑にせず、かつ深いネストを作らないというバランスを保つことのできるオプションのこと。
簡単に言うと、“rails routes“した時のURLを短く分かりやすくしてくれるもの。

##shallowオプションの実例
###オプション無

“`
resources :posts, only: %i(index show new create destroy) do
resources :likes, only: %i(create destroy)
end

#URLを確認
$rails routes -c likes
Prefix Verb URI Pattern Controller#Action
post_likes POST /posts/:post_id/likes(.:format) likes#create
post_like DELETE /posts/:post_id/likes/:id(.:format) likes#dest

元記事を表示

【Rails】simple_formatとは

##simple_formatとは
simple_formatは、改行文字を含むテキストをブラウザ上で表示させる時に使われるヘルパー。
simple_formatの特徴
・文字列を“

“で囲む
・改行には“
“を付与
・連続した改行については、“

“を付与

##記入法

“`
<%= simple_format(入力値) %>
“`

##simple_formatの有無
###simple_formatなし
本当は改行しているが、出力値では改行されていない。

“`
# 入力値
simple_formatのテスト。
改行を1度挟む。

# 出力値
simple_formatのテスト。 改行を1度挟む。
“`

###simple_formatあり
出力値でも改行されていることがわかる。
全体を

で括っているため、最後の行にスペースが入っているように見える。

“`
# 入力値
simple_formatのテスト。
改行を1度挟む。

# 出力値
simple_formatのテスト。
改行を1度挟む。
—ここに1文空く—

元記事を表示

RSpecで表示順をテストする(SystemSpec)

アプリ内のユーザーの表示順を任意に変更する機能のテストを書く上で、正規表現も含めて勉強になったのでメモを残します。

2人の“user“の表示順が正しく変更されているかをテストします。

#テスト
“`ruby:spec/system
RSpec.describe ‘表示順変更テスト’, type: :system do
let!(:user) { FactoryBot.create(:user) }
let!(:other_user) { FactoryBot.create(:other_user) }

describe ‘表示順を変更する’ do
it ‘ユーザー表示順を変更できる’ do
#user→other_userの順番で表示されていることをテスト
expect(page.text).to match %r{#{user.name}.*#{other_user.name}}
#other_user→userの順番で表示されていないことをテスト
expect(page.text).not_to mat

元記事を表示

【Rails】decoraterの使い方

##decoraterとは
Decoratorというデザインパターンを導入することで、ビューファイルにロジックを記述しないことが出来る。

使用イメージとしてはModelとViewの中間にデータの加工の役割を担うもの。これらを使えるようにするため、gemをインストールする。

##Draper導入
まず最初にgemをインストール。

“`
#Gemfile
gem ‘draper’

$ budle install
“`
次にセットアップ。

“`
# app/decorators/application_decorator.rb を作成
# ApplicationDecoratorは全てのDecoratorの親クラスになる
$ rails generate draper:install
“`

##Draper使用例
データベースに“first_name: “田中”, last_name: “太郎”“という名をviewにて**フルネームで表示**させようとすると、以下のようになる。

“`
<%= "#{@user.first_name} #{@user.last_na

元記事を表示

pumaを起動させるとconfig/initializers/devise.rb:17: syntax error, unexpected << (SyntaxError) <<<<<<< HEAD ^~

##背景
pumaを起動させようとしたらこの文法エラーが出て、最初どういう意味かわかりませんでした。

##エラーの意味

“`
config/initializers/devise.rb:17: syntax error, unexpected << (SyntaxError) <<<<<<< HEAD ^~ ``` というエラーは皆さんもご存知の通り文法が間違っているというエラーなのですが、<<<<<<< HEAD ^~はファイルのコンフリクトを意味しています。(devise.rbにコンフリクトしている行があるよと教えてくれている) ##解決法 vimで↑のファイルを開くと17行目に不等号と=がついている箇所があるのと思うので、その行を消してください。そうするとエラーは解決します。

元記事を表示

はじめてのTerraform【リソース生成編】

# はじめに

当記事では、AWSのECS/Fargateインフラを
Terraformでコードから再現する作業をまとめています。

なお、Terraformのインストールなど事前準備は
別記事でまとめていますので、まずはそちらをご確認ください。

https://qiita.com/Shuhei_Nakada/items/422479ad38a2a85f4444

また、Terraformではなく、AWSマネジメントコンソールからGUIで
ECS/Fargateインフラを構築する手順は別記事でまとめていますので
ご興味がございましたら、ご覧ください。

https://qiita.com/Shuhei_Nakada/items/9e4c51bf9ae59f0b1a2b

前提として、ECS/Fargateにホストしているアプリは`Rails`となりますので
その点をご理解ください。

# 使用技術

* Terraform: 1.1.2
* ECS/Fargate: blue/greenデプロイメント
* Rails: 6
* MySQL: 8

# インフラ構成図

下記通

元記事を表示

【Rails】ActiveStorageでS3に画像をアップロードする方法

##はじめに
railsでポートフォリオを作りAWSでデプロイしたあと、本番環境で画像をアップロードできるようにしました。
エラーで少し苦戦したので、同じようなエラーで悩んでいる人の参考になればと思います。
AWSでデプロイ済みの人向けなので、デプロイに関する部分などは省きます。
またActiveStorageも導入済みであるとします。

##環境
OS mac
ruby 2.6.6
rails 5.2.6

##AWSでやること
###IAMユーザーの作成
S3にアクセスするためのIAMユーザーを作成します。

1. IAMダッシュボードで「ユーザーの追加」をクリック
1. ユーザー名は任意で
1. 「アクセスの種類」は「プログラムによるアクセス」を選択
1. アクセス権限は「AmazonS3FullAccess」に設定
1. 認証情報をダウンロード(.csv) *あとで使います

###S3バケットの作成

1. S3ダッシュボードで「バケットの作成」をクリック
1. バケット名とリージョンを設定
1. デフォルトの「パブリックアクセスを全てブロック」にチェック
1. バケットを

元記事を表示

「form-with」なぜ自動的にcreateアクションが呼ばれるのか

form-withはruby on railsで使える、コードをよりシンプルに書くためのヘルパーメソッドです。
form-withのmodelオプションについて勉強していて浮かんだ疑問が、
「指定していないのに、なぜ自動的にcreateアクションが呼ばれるのか。。」
この疑問を解決するために、今回はform-withのmodelオプションの使い方と仕組みについて備忘録としてまとめます。

#form-withには2種類の書き方がある
 まずは前提として、form-withの基本的な2種類の使い方についてまとめます。
1つ目はmodelオプションを使った以下のような書き方です。

“`
<%= form_with model: モデルのインスタンス do |form| %>
フォーム内容
<% end %>
“`
2つめはurlオプションでパスを指定する方法です

“`
<%= form_with url: root_path do |form|%>
フォーム内容
<%= end%>
“`

#モデルオプションでは自動的にURLの指定が行われる
 さてここで1つ疑

元記事を表示

herokuでのデプロイがうまくいかない時(マイグレーションファイル編)

# 前提
本番環境(今回はheroku)とローカル環境(自分のパソコン内)では別々のDBが使われます
ローカルではうまく行っている場合でも本番環境ではDBがうまく構築されないことがあります

原因はいくつか考えられますが、

– テーブルがないのにカラムを追加しようとしている
– 同じ名前のカラムを追加しようとしてる
– 作成されてないテーブル(カラム)を削除しようとしている

などが挙げられます!

# マイグレーションファイルを綺麗にする
本番環境ではマイグレーションファイルを元に1からDBが作成されます
よってマイグレーションファイルを見やすくわかりやすくしてあげる必要があります。
ポイントをまとめます!

– 1マイグレーションファイルに1テーブル。テーブルとカラムは一度に作成してあげる
– カラムやテーブルを削除するマイグレーションファイルは消す
– 外部キーを使う場合は親テーブルを先に作成する。(マイグレーションファイルをリネームすれば順番を変更できます)

以上の観点があればマイグレーションファイルをスッキリできると思います!

# 変更したマイグレーションファイルをデプ

元記事を表示

rails sできないのは権限が付与されていないからだった

###コトの発端〜
railsアプリをローカルで確認してみようと`rails s`すると、`config/boot.rb`に対して`cannot load such file`とエラー文が出てアプリが開けない状態に、、

`config/boot.rb`に原因がありそうなのでVScode上で開いてみても開けなくなっていた。
ここでもエラー文を見てみると、
**「**`config/boot.rbを読み取れません。(NoPermissions (FileSystemError): Error: EACCES: permission denied`**」**
とのこと。自分にboot.rbを開く権限がないからファイルが開けない。従ってrails sに必要なboot.rbが使えないからアプリが開けなくなっていました。

#権限を確認する

cdはアプリのディレクトリで以下のコマンドを打つ。

“`:ターミナル
ls -l
“`

そうすると各ファイル・ディレクトリに対する自分の権限の範囲がどこまでなのか一覧で見れると思います。
以下一部抜粋したもの

元記事を表示

Rackアプリ向けWebサーバーの選択(Puma vs Unicorn)

それぞれ調べた結果

– Puma: 導入が簡単.Rails5系以降のデファクトスタンダード?Herokuが推してるらしい。
– Unicorn: 広帯域で高速な動作向き(メモリは食う) Rails4系以前のデファクトスタンダード?

「rails unicorn ゲーム」でググるだと、アカツキ(ドッカンバトルとかロマサガの開発会社)ではUnicornを採用してるっぽい。
これらはかなりの人気ゲームなので、アクセス負荷もかなり高いことが予想される。
逆に「rails puma ゲーム」でググっても、特にゲーム会社の記事がヒットしたりしなかった。
となると・・・あまり実績もない可能性がある。
**高負荷向けならunicorn安定か。**

**参考**

– https://stackshare.io/stackups/puma-vs-unicorn
– [環境変数を設定するだけでRuby on Railsサーバが10%高速化する(かもしれない)話](https://hackerslab.aktsk.jp/2019/12/01/141551)

**関連**

https://qiit

元記事を表示

Rails案件で一般的に「Nginx – Puma, Unicorn – Rails」構成を取る理由

それぞれの説明

– **Nginx**: 一般的なWebサーバ。デフォでクライアントからのリクエストをバッファリング可能
– **Puma, Unicorn**: Rackアプリ向けWebサーバ。クライアントからのリクエストをバッファリングができないため、低速回線によるリクエストだと接続が完了するまでつまってしまう。UnicornはRackの機能をあわせ持つ(Pumaも?)
– **Rack**: Rackアプリ向けWebサーバとRailsとをつなぐAPIを提供するアプリケーションサーバ(ライブラリ).一般的なWebサーバNginxとの接続は想定されていない。

・・・というわけで、一般的に
 Nginx – Puma, Unicorn – Rails
という構成が取られているみたい。

**参考**

– [【Rails】Webサーバー「Unicorn」の基本情報と実装方法](https://www.autovice.jp/articles/146)
– [Apacheとnginxのリバースプロキシ挙動差(バッファリング)](https://qiita.com/no_clock/

元記事を表示

備忘録:「saveメソッド」と「save!メソッド」の違い

## saveメソッドとは
DBにデータを保存するメソッド。(インスタンスメソッドです。)

※ちなみにsaveはActiveRecordの基本メソッドです。

## 「saveメソッド」と「save!メソッド」の違い
saveメソッド:
保存に成功した場合→trueを返す
保存に失敗した場合→falseを返す
※saveメソッドを使う場合は、if/else文で「保存できた場合」と「保存できなかった場合」とで処理をわけると良い。

save!メソッド:
保存に成功した場合→trueを返す
保存に失敗した場合→例外を発生させる
※保存に失敗した場合の処理はrescue節で行う必要がある。

>引用元:
>https://techacademy.jp/magazine/22082
>http://www.code-magagine.com/?p=9275

元記事を表示

OTHERカテゴリの最新記事