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

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

【Ruby】麻雀の点棒を値オブジェクトにしてみた?️

## はじめに
この記事は、麻雀大好きな新米エンジニアが見よう見まねで点棒(麻雀における通貨みたいなもの)を値オブジェクトにしてみたという記事です。暇つぶし程度に読んでもらえたら嬉しいです。
まず簡単に「そもそも値オブジェクトって?」という話をしてから、実際に自分が書いてみた麻雀の点棒オブジェクトを紹介したいと思います。
(※ **麻雀への知識がある前提で書かれた記事です**。何もわからないという方は、「値オブジェクトとは」の項目だけ読むことをお勧めします。)
## 値オブジェクトとは
値オブジェクトとは、**値をクラスとして表現する設計パターンのこと**です。
より詳しく言えば、アプリケーションで頻繁に使われる金額や日付、電話番号といった値をクラスとして扱い、**各値の正常性を初期化段階で担保しながら値そのものとその振る舞いをまとめて管理すること**です。

例えば金額を単なるint型の変数として扱った場合、金額用の変数に負の値が入力されてしまったり、「販売数」など別のint型を金額用の変数に加算してしまうといったミスが起こり得ますが、金額を値オブジェクト化することでこのようなミスを

元記事を表示

【Rails】HerokuからSlack APIにアクセスするとSSL_CTX_load_verify_file: system libというエラーが起きる場合の対処法

## 発生した問題
ローカルでは問題なく動いていたRailsアプリをHerokuにデプロイすると、Slack APIにアクセスするタイミングで以下のようなエラーが発生しました。

“`
ActionView::Template::Error (SSL_CTX_load_verify_file: system lib):
1: channels = slack_client.channels
“`

このエラーが発生した環境は以下のとおりです。

– Ruby 3.1.2
– Rails 7.0.4
– slack-ruby-client 1.1.0
– heroku-22 stack

## 原因

下記のredditにほぼ同じ現象が載っていました。

[Having issues installing Ruby : ruby](https://www.reddit.com/r/ruby/comments/un9rn1/comment/ifqidwl/)

> Hey OP: I’m running into the same `SSL_CTX_load_verify_fi

元記事を表示

引数の数が不定なメソッドの書き方

## 引数の数が不定なメソッドの書き方
メソッドの定義時の引数に 「*変数名」 で定義し、メソッド実行後は、与えられた引数をまとめて「配列」として出力することができる。
書き方は下記の通り。
“`
(fooメソッドを定義)
def foo(*args)
args
end

p foo(1, 2, 3) #=> [1, 2, 3]
“`
また、設定した引数の数でない時にメソッドを実行した時は下記のようになる。
“`
(Methメソッドに通常の引数と引数の数が不定な引数を設定し、値を配列で返す処理を設定)
def meth (arg, *args)
[arg, args]
end

(メソッド実行)
p meth(1) #=> [1, []] (*argsの方には引数を入れメソッドを実行していないので、[]が出力される)

p meth(1, 2, 3) #=> [1, [2, 3]] (最初の1つ目の引数は、argへ、残りの引数は*argsの方に「配列」として出力される)
“`
*また、この時p meth(1, 2, 3).flatte

元記事を表示

importmap-railsでvue.jsの開発用ビルドと本番用ビルドの切り替えを行う

vue.js (vue.esm-browser.js) には、開発用ビルドと、本番用ビルドが用意されています。
Railsの環境に合わせて、vue.jsの環境を切り替える方法を簡単にまとめたいと思います。

vue.jsのビルドについては公式サイトをご確認下さい。

https://v3.ja.vuejs.org/guide/installation.html#%E3%81%95%E3%81%BE%E3%81%95%E3%82%99%E3%81%BE%E3%81%AA%E3%83%92%E3%82%99%E3%83%AB%E3%83%88%E3%82%99%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

## 開発用ビルドと本番用ビルドの切り替え

`config/importmap.rb` 内で、Rails.envで環境を判定して、pinの切り替えを行います。

### CDNを利用する場合
“`importmap.rb
if Rails.env.development?
pin “vue”, to: “https://unpkg.com/vue@3

元記事を表示

Rails7 APIモード device エラー「verify_authenticity_token has not been define」

# 結論
ApplicationControllerで継承元をAPIからBaseに変更する。
“`ruby
class ApplicationController < ActionController::Base include DeviseTokenAuth::Concerns::SetUserByToken skip_before_action :verify_authenticity_token helper_method :current_user, :user_signed_in? end ```

元記事を表示

docker-compose up -d実行時にエラー発生 “ERROR: In file ‘./docker-compose.yml’, volume must be a mapping, not a string.”

こんにちは!ムーさんです!
Docker,Vagrantの学習をメインに続けています。その過程で、DockerfileをビルドしてからRuby,Postgresqlのイメージをpullしてきて簡易的なwebサイトの構築を実施していますが、コンテナが立ち上がらないエラーが発生しました…(泣)

# 1.エラー
Dockerfileをビルドさせた後に、docker-compose.ymlファイルを作成してdocker-compose up -dをしたら下記のエラーが発生しました。
““
$ docker-compose up -d
ERROR: In file ‘./docker-compose.yml’, volume must be a mapping, not a string.

““

# 2.原因
これは、間違いなくdocker-compose.ymlファイルの記述が間違ってますね!でも、どこが間違っているのでしょうか?
“volume must be a mapping”と出力されているので、おそらくホストとコンテナをマウントさせる記述のところですかね?

“`

元記事を表示

Rails7 JavaScriptを読み込む

## Rails7でJavaScriptを読み込む方法について
Rails7から、バンドルツールが変更されたため、備忘録もかね、簡単にまとめました。

### Step1

`app/javascript/application.js`に読み込むファイルをパス指定
“`java
// Configure your import map in config/importmap.rb. Read more: https://github.com/rails/importmap-rails
import “@hotwired/turbo-rails”;
import “controllers”;

// 追記
import “./test/test”;
“`

### Step2
`importmap`への登録
※Rails7より、JavaScrpit Bandlerが、`webpacker`から、`importmaps`へと変更
`config/importmap.rb`にファイルが読み込まれるように記載する必要がある。
これによりブラウザ側で名前解決を行ってくれる。
“`ruby

元記事を表示

Loggerライブラリを使用して一定期間ごとにログファイルを記録したい

# 概要
一定の期間ごとにログファイルをローテートする場合には、
引数でローテートする期間を指定する。
常にログを確認する場合一つのログファイルに書き込まれると確認が大変なため期間でログを管理すると良いと感じた。

“`ruby
require ‘logger’
logger = Logger.new(‘foo.log’, ‘daily’) #日ごとのログ
logger = Logger.new(‘foo.log’, ‘weekly’) #週ごとのログ
logger = Logger.new(‘foo.log’, ‘monthly’) #月ごとのログ
“`

# 参考
https://docs.ruby-lang.org/ja/latest/library/logger.html

元記事を表示

groupメソッドの応用(関連先テーブルのデータをグループ化して表示する方法)

# groupメソッドとは?

指定したカラムの各値ごとにグループ化するメソッド。

下記のテーブルから、各ownerのcatの数のデータを抽出してみる。

![20221002_ownersテーブルの画像(sex,incomeカラムとレコード数を追加).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/e9612fcb-30c4-4d06-89a9-dc456f8cd5e6.png)

![20221002_catsテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/124c390f-0e08-8419-e6b4-cacd87ec2dcd.png)

(catsテーブルからowner_idごとにグループ化し、ownerごとに何匹ネコを飼っているか数え上げる)
“`
irb(main):045:0> Cat.group(:owner_id).count
(0.2ms

元記事を表示

Docker で Rails 7 + MySQL 8.0 の環境を構築する (Compose V2 対応)(M1 Mac 対応)

# 作業内容

### ディレクトリ構成
“`
myrailsapp/
├── Dockerfile
├── compose.yaml
├── entrypoint.sh
├── Gemfile
├── Gemfile.lock
└── mysql/
└── my.cnf
“`

### ファイルの準備
“`dockerfile:Dockerfile
FROM ruby:3.1.2

RUN mkdir /app
WORKDIR /app
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

RUN gem update –system
RUN bundle update –bundler

RUN bundle install
COPY . /app

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT [“entrypoint.sh”]
EXPOSE 3000

CMD [“rails”, “s

元記事を表示

【個人用】Rails バリデーション設定〜エラーメッセージの表示

# 個人メモとして要点だけ簡潔に残します。

## バリデーションの設定
`Model` に記載

“`ruby
class Blog < ApplicationRecord validates :title, presence:true validates :content, presence:true, length: {minimum: 5} end ``` ## バリデーションのトリガーメソッド * 以下のメソッドを実行すると、バリデーションが実行される * create * create! * save * save! * update * update! ## コントローラー ### バリデーションが実行される ```ruby # POST /blogs or /blogs.json def create @blog = Blog.new(blog_params) respond_to do |format| # バリデーションがトリガー if @b

元記事を表示

[Rails]ツイッターのクローンを作ってみました。

# はじめに

Docker, Ruby, Railsの学習を終えた時点で、実践を通じて理解を深めるためのスクールの課題、ツイッターのクローンです。
機能ごとに、概要、機能の要件、工夫した点、 習ったことについて解説したいと思います!

# サービス環境
– ruby 2.6.8
– Rails 6.1.5
– docker
– mysql
– Slim, SCSS

# できるようになったこと。
– MVCの理解
– Slim,SCSSの書き方
– Devise
– ModelのValidation
– Rails-JSの繋ぎ
– ActiveRecord
– Omniauth
– ポリモーフィック関連付け
– テスト

# 目次
| |機能|
|——-|:———-:|
|1|[**ログインと会員登録(Devise)**]
|2|[**ユーザー詳細ページ作成**]
|3|[**ツイート機能&ツイートにコメント作成**]
|4|[**画像アップロード (AcriveRecord)**]
|5|[**Git Hub Login (Omniauth)**]
|6|[

元記事を表示

to_sqlメソッドでActiveRecord実行時のSQLを確認

## 1. `to_sql`を使用し、ActiveRecordのクエリを出力

“`rb:sample.rb
target_members = Member.joins(:positions).where(positions: { position_status: 5 })
puts target_members.to_sql
“`

– RSpecで任意のテストを実行すると、`putsメソッド`を使っているため標準出力に出力される

“`terminal:Run
SELECT “members”.* FROM “members” INNER JOIN “positions” ON “positions”.”member_id” = “members”.”id” WHERE “positions”.”position_status” = 5
“`

:::note warn
`pメソッド`で出力している際は出力結果に`”`(ダブルクォーテーション)のみならず`\`(バックスラッシュ)も含まれる
:::

## 2. エディタなどで置換
– 私はいつも`Visual Studio

元記事を表示

pluckメソッドの使い方と注意点

## pluckメソッド
引数に指定したカラムの値を配列で返してくれるメソッド。
使い方は下記の通り。

モデル名.pluck(:カラム名)

実際に使用してみる。
![20221001_ownersテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/efa06978-4044-0920-470e-44eae6241826.png)

(nameカラムを指定したpluckメソッドを実行し、nameカラムの値を配列で取得する)

“`
irb(main):011:0> Owner.pluck(:name)
(0.2ms) SELECT “owners”.”name” FROM “owners”
=> [“田中”, “伊藤”, “高橋”, “加藤”]
“`

また、引数を「複数」設定することで、二次元配列で値を取得することができる。

例えば、テーブルが下記の内容であったとする。

![20221001_ownersテーブルとcatsテーブルの画像.png](h

元記事を表示

[Rails] ec2上でcronを使ってrakeタスクを定期実行

## 実現したいこと
ec2にデプロイしたrailsアプリケーションでrakeタスクを定期実行したい。
あまりいい記事が見つからなかったのでまとめました。

## 前提
2022年10月現在
ruby 3.1.2
Rails 6.1.6
whenever
ec2
capistranoを使ってデプロイ

## 手順

1. Capistranoを適用する
2. schedule.rbを編集する
3. crontabをupdate
4. タイムゾーンを変更する
5. ec2上でエラーログを確認する方法

## 1, Capistranoに導入

capfileとdeploy.rbを編集する。
“`capfiel“`
“`ruby
require ‘whenever/capistrano’
“`
“`deploy.rb“`
“`ruby
set :whenever_roles, -> { :app }
“`

## 2, schedule.rbを編集する

確認すべきポイントはrakeタスクの環境がproductionになっているか。
そしてec2はbashなので、zshを

元記事を表示

dependent: :destroyオプションとActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed)の対応方法について

## dependent: :destroyオプションとActiveRecord::InvalidForeignKey (SQLite3::ConstraintException: FOREIGN KEY constraint failed)について

dependent: :destroyオプションは、親モデルのデータが削除されるときにそれに関連していた子モデルのデータも削除することができるオプション。
このオプションを設定しないと、親モデルのテーブルのデータを削除するときにエラーになる。

![20221001_ownersテーブルとcatsテーブルの画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/829500/85114159-d1f8-51bb-2c1d-ea53bba26c5f.png)

上記のようなテーブルがあり、ownersテーブルのid=3 高橋さんを削除すべく以下のコマンドを実行。

“`ruby:rails c コマンドの実行
irb(main):002:0> Owne

元記事を表示

Rails4.2でArelを用いてORクエリを作成

:::note warn
Rails4.2からActiveRecordがSQLのキャッシュのためにSQLのローカル変数 (`$1`など) を使うようになり、ActiveRecordで生成したActiveRecord::RelationをそのままORで繋げられなくなってしまった。
:::

– 解決時に勉強になったので備忘録として記載
– 直接SQLを書けば早い話だが、そういう訳にもいかなかったので最低限はArelで補わなければいけないという状況下

:::note
前提として、「なるべくArelを使わないようにして実装する」ことは心掛ける
:::
→ 参考:[Arelでクエリを書くのはやめた方が良い5つの理由](https://qiita.com/jnchito/items/630b9f038c87298b5756)

## モデル

– aa_sample
– bb_sample
– cc_sample
– dd_sample

“`rb:関連付け
aa_samples has_many bb_samples
aa_samples has_many cc_samples
a

元記事を表示

ReactからRails経由でS3へファイルをアップロードする方法

やっはろー、へっぽこだよ。
Reactでファイルのアップロードをする機能を作ったら案外手こずったから記事にしてみました。

バックエンドはRailsでS3にファイルを格納してます。

## ReactからファイルデータをRailsへ飛ばす

まずファイルを添付するボタンを作ります。
色々ありますが、今回は[Material-UI](https://mui.com)を採用しました。
おしゃれかつ痒い所まで手が届く機能を備えてます。

まずはMaterial-UIをインストールします。
“`
yarn add @mui/material @emotion/react @emotion/styled
“`

次に以下のコードをコピペしてください。
“`typescript:typescript
import React,{useMemo} from “react”;
import Input from “@mui/material/Input”;

export default function APP() {
const [file, setFile] = React.useS

元記事を表示

既存RailsアプリでNext.jsへの段階移行を始めた話

## 背景
### あるRailsアプリの新機能開発の様子

#### PM
「〜〜という新機能を追加します」

#### BE
「(routerに新しいリソース書いて)」
「(新しいモデルとDBマイグレーション書いて)」
「(コントローラとモデルにロジック書いて)」
「(viewテンプレートには仮でマークアップして)」

“`erb
<仮のdiv>
<% @items.each do |item| %>
<仮のdiv>
<%= item.name %>
<%= button_tag :item_button %>

<% end %>

“`

「マークアップお願いします」
「それとボタンクリックしたら〜〜するようにお願いします」
「>FE」

#### FE

「マークアップして」

“`erb
<適切なタグ class="適切なクラス">
<% @items.each do |item| %>
<適切なタ

元記事を表示

【Ruby on Rails】マイグレーション時に、任意のrakeタスクを実行する

今回は、マイグレーション時にrakeタスクを実行する実装をしたので、備忘録です。

# 実装
“`ruby
Rake::Task[‘db:migrate’].enhance do
Rake::Task[‘任意のタスク’].invoke
end
“`
やっていることとしては、enhanceでdb:migrateを事前タスクとして指定して、actionの中で任意のtaskをinvokeしているといった感じです。
独自のログを出力したり、最新のDBを自動でダンプしたりと使いどころは多いかと思います。

https://docs.ruby-lang.org/ja/latest/method/Rake=3a=3aTask/i/enhance.html

元記事を表示

OTHERカテゴリの最新記事