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

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

Select2の代替にTomSelectを使ってみる

## 概要
インクリメンタルでドロップダウンの選択肢を絞り込める[select2-rails](https://github.com/argerim/select2-rails)のgemはとても便利なんだけど、jQueryに依存しているので、Rails 7 + StimulusなどのjQueryを使わないモダンな環境では使用をためらってしまうかと思います。

![スクリーンショット 2022-10-03 19.15.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/176427/4514fe7a-5489-2f75-7401-378a01879d7f.png “Select2”)

Select2の代わりに使える[Tom Select](https://github.com/orchidjs/tom-select/)がSelect2同様に簡単で便利だったので紹介します。

## 環境
– Rails 7.0.3
– stimulus-rails
– jsbundling-rails(importmap

元記事を表示

【Rails】重複処理防止機能の実装例

# 同時に処理が走ってほしくないメソッド

“`ruby: Controller
def foo
AggregateTablesService.new.call # 数十万行のレコードの集計を行い、別のテーブルに集計を保存するサービス
@something = CreateGraph.new.call # 集計結果からグラフを生み出しキャッシュに保存するサービス。キャッシュがあればそれを読み込む
end
“`

“`ruby: Batch(毎日深夜に回る)
def exec
AggregateTablesService.new.call
CreateGraph.new.call
end
“`

大量かつ複雑なレコードを扱うにあたって、1)一旦それらを扱いやすいように&処理を高速化するために集計テーブルにまとめる、2)その集計データを使ってグラフを作るという処理を前提におきます。

まず、何度もメソッドが走ることに対しては、「レコードやキャッシュがあればreturnで処理を抜ける」という方法で対策することができるでしょう。

“`ruby: 集計サービス
class

元記事を表示

Rails 検索機能 数値

Railsで数値を検索する機能を作る機会があったので
メモとして残しておきます!

# 目次

1. [今回作るもの](#今回作るもの)
1. [Viewの作成](#viewの作成)
1. [Controllerの編集](#controllerの編集)
1. [入力フィールドをSelectで実装](#入力フィールドをselectで実装)

イメージが沸くように見た目(View)から作っていきます🙌

# 今回作るもの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2017749/5b278645-4cb5-0158-0de7-360293843693.png)
上記の画像のように、投稿内容や投稿タイトルに関する文字列検索機能とは
また別に金額に関して、最大値と最小値を入力して検索をかけます!
[select_tag](https://railsdoc.com/page/select_tag)でわかりやすく範囲にしても良さそうですね!

# Viewの作成
検索機能に該当する部分はこんな感

元記事を表示

【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を書けば早い話だが、生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
aa_sa

元記事を表示

OTHERカテゴリの最新記事