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

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

Railsで子レコードを複数同時保存する際のバリデーション

## やりたいこと
`gem ‘cocoon’`を使ったStationレコードのedit画面内の営業時間登録フォームで、曜日の重複をバリデーションメッセージ表示したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/504414/59950242-373a-c253-0993-0b8dd13f137a.png)

ベストプラクティスを調べてみたが見つからなかったので、親モデルでのカスタムバリデーションで実装する

## モデル
“`ruby
### Stationモデル
class Station < ActiveRecord::Base has_many :business_hours, inverse_of: :station, dependent: :destroy validate :business_hours_day_of_week_is_uniq def business_hours_day_of_week_is_uniq day_of_week_a

元記事を表示

テストを自動化する

# 動機
テストのことを知らないため

# プログラマの三大美徳
怠惰、短気、傲慢がある。

### 怠惰
全体の労力を減らすために手間を惜しまない。

### 短気
コンピュータの動作が怠惰な時に怒りを感じる

### 傲慢
自分の書いたプログラムは誰に見せても恥ずかしくない胸を張って言える自尊心

## 気づき
三大美徳のためにテストを使うのか。

# Minitestの基本を選んだ理由
Railsのデフォルトのテすティングフレームワークなので、Railsを開発する時にも知識を活かしやすい。
※排発の現場ではMinitest以外のフレームワークが使われることもあるため

# テストコードの雛形
“`rb
require ‘minitest/autorun’

class SampleTest < Minitest::Test def test_sample assert_equal 'RUBY', 'ruby'.upcase end end ``` ### クラス名の注意点 Testで終わる、またはTestで始まる名前をつけることが多い。 ### テストのファイ

元記事を表示

Rails6系でtailwindcssを導入しようとして手こずった

Rails6系でポートフォリオを作成する中で、CSSフレームワークであるtailwindcssを導入しようとしたらかなり手こずったのでまとめます。
自分のためのまとめでもあるので、エラーも含め時系列順に書いています。
ご参考にされる際は最後までご覧ください。
記事初投稿&初学者のため、誤りなどありましたらお気軽にご指摘いただけると幸いです。

環境
ruby 3.1.2
rails 6.1.7

# tailwindcssをインストール
Gemfileに
“` ruby:Gemfile
gem ‘tailwindcss-rails’
“`
を追記して “bundle install“。

これでGemfile.lockに“tailwindcss-rails“が追加されるはずです。

次に
“` ruby:ターミナル
rails tailwindcss:install
“`

実行時のログは以下になります。(XXはユーザー名、XXXXXはディレクトリ名)
“`
Add Tailwindcss include tags and container element in

元記事を表示

flashに複数行を表示する方法について

## 環境
Rails5.2
Ubuntu20.4
Bootstrap5

## はじめに
flashに複数行を改行付でセットし、BootstrapのAlertに、箇条書きで表示する方法について書いてみました。

## 解説
flashに表示する複数のメッセージを、msg変数にセットします。
“`test_controller.rb
msg = []
msg << "メッセージ1" msg << "メッセージ2" msg << "メッセージ3" ``` msg配列から1要素づつ取得して、notice変数に文字列としてセットします。文字列の最後に、HTMLの改行**br**をセットします。brはmsg配列の最後の要素にはセットしません。 ```test_controller.rb msg.each_with_index do |val, idx| notice += "・ " + val notice += "
” unless (msg.length == idx + 1)
end
flash[:notice] = notice
redirect_to tes

元記事を表示

【Laravel / Rails】bulk insertについてまとめ

一度に複数のデータを1回のクエリでインサートしたいとき(bulk insert)、insert

## PHP/Laravel

クエリビルダの“`insert“`メソッド

“`php
DB::table(‘users’)->insert([
[‘email’ => ‘picard@example.com’, ‘votes’ => 0],
[‘email’ => ‘janeway@example.com’, ‘votes’ => 0],
]);
“`
https://readouble.com/laravel/9.x/ja/queries.html

先輩エンジニアに聞いたところ、「bulk insertは使うとしたら100万件くらいのデータ量の場合だが極力使わないほうがいい」とのこと。
今回のプロジェクトではデータ量がそこまで大量ではなかったため、bulk insertは結局使わないことにした。
下記記事も参考になった。

https://zenn.dev/naoki_oshiumi/articles/648a00bcd4d209

ただ、調べるとLar

元記事を表示

Docker環境でrails 6以降の構築しました。あ、macはM1チップです。

私はサラリーマンである。
ITエンジニアである。明日も7時前に起きて出社の準備をしないといけない。今深夜1時。

この記事を書き終わる頃には2時とかだろう、早く寝ろ俺。

しかし一個だけ言わせてほしい。

dockerお前の仕事は環境の差異をなくすことちゃうんか!?お前が一番差異に困惑しとるやないかぇぇぇぇぇぇウェえええええええ!!!

# 失礼しました

タイトルの通りrailsをDockerに走らせるだけの簡単なお仕事でミスりまくってものすごい時間を費やしたので書いてます。

# 試したこと

https://zenn.dev/tmasuyama1114/articles/rails-docker-5x-how-to

自分が作ったdeviceでログイン + 文章投稿する という簡単なアプリケーションを
上記リンクを参考にDockercomposeファイルを足してコンテナ化しようとしました。

# そもそも使てるアプリケーションがrails 6~

まず手始めにエラーが出たのは

“`ターミナル
bundler: command not found: rail……..
`

元記事を表示

MySQLではinsertで生成されるIDが帰ってこない問題へのアプローチ

注)mysql 5.6のことだけ調べました。他のバージョンのことはよくわからないです。

# この記事でできるようになること
mysqlでinsertしたレコードの自動生成されたIDの取得

# 解決したかった問題
Railsでbulk insertする場合

– 生SQLでinsert文流す
– activerecord-importを使う

を使うのかなと思うのですが、mysqlは生成したレコードのIDがわからない、、、

生成したIDで紐付け処理を行う場合は、再度fetchしてIDを取得する必要がある。
が、取得する場合にkey値がなかったらどうすればいいのか

# 例えばこんなデータ

“`sql
mysql> desc parents;
+————+———————+——+—–+———+—————-+
| Field | Type | Null | Key | Default | Extra |
+————+—

元記事を表示

authenticate_user!メソッド

# authenticate_user!メソッドとは
ログイン状態によって表示するページを切り替えるdeviseのメソッドで

ユーザーがログインしていなければ、そのユーザーをログイン画面に遷移させる事が出来ます
以下のようにcontroller内にbefore_actionを記述する事で、アクションを実行する前にログインしていなければログイン画面に遷移させられます。

“`:ruby
before_action :authenticate_user!
“`

##### indexアクションではログインをしていなくても閲覧できるようにしたい場合は以下のように記述する

“`:ruby indexはログインせずに閲覧できる
before_action :authenticate_user!, except: :index
“`

##### このように複数のアクションにも適用する事も出来ます

“`:ruby indexとshowをログインせずに閲覧できる
before_action :authenticate_user!, except: [:index, :show]
`

元記事を表示

exec user process caused: exec format errorの原因と対処法 (ECS)

Rails+Docker環境にて、ECS側(Fargate使用)のコンテナ起動時に下記エラーに悩まされたのでシェアをしたいと思います。
“`
standard_init_linux.go:228: exec user process caused: exec format error
“`

## 原因
結論から言うとM1 Macで作成したイメージを、コンテナが動作するFargateのCPUアーキテクチャ側が読み込むことができないのが原因のようです。CPUアーキテクチャとはその名の通りCPU側の設計を指しており、この設計には種類があります。有名どころで言うと、x86(intel)とARM(ARM)が存在します。今回問題だったのは、このCPUアーキテクチャがM1でビルドした際はARMで作成され、FargateのCPUアーキテクチャではARM作成されたイメージは対応できない為でした。
試しにターミナルから下記コマンドで、自分のMac(M1)のCPUアーキテクチャを確認したところ確かにARMであることが確認できました。
“`
uname -m
“`

## 対策
対策として、以下の2

元記事を表示

【Rails】既存Userモデルのカラムと,deviseで生成したUserモデルのカラムが重複し,エラーとなったときの対応

# はじめに
deviseの導入時に遭遇したエラーと対処法について記事にしました.初学者の学習の一助となれば幸いです.
### 環境
Ruby 3.1.2
Rails 6.1.7
### 前提
以下のコマンドで既にUserモデルを作成しており,データベースに“`email“`カラムをデータベースに適用済みという状況で,deviseを導入しエラーが発生しました.
“`db:コマンド
rails g model User (略) email:string
rails db:migrate
“`
個人開発を前提にしてます.

# エラー内容
devise導入のため,Gemfileに“`gem ‘devise’“`を記述後,以下のコマンドを実行したところ,以下のエラーが発生しました.
“`db:コマンド
bundle install
rails g devise:install
rails g devise User
rails db:migrate
“`
“`db:エラー内容
== 20220928040542 AddDeviseToUsers: migrating ==

元記事を表示

MySQLがうまくいかない〜掲示板作成〜

## ポートフォリオ作成開始!
今日から掲示板作成するぞ!([作成する掲示板の内容はこの記事に記載](https://qiita.com/takumi-1016/items/a4c80341aa2b917c0e9e))
ということで、プログラミングスクールで学んだRailsを用いてアプリを作成していきます。

## アプリの作成
例によって
“`:ターミナル
rails new アプリ名 -d mysql
“`
でアプリを作成していきます。(参考サイト:[【Rails/MySQL】RailsにMySQLを導入する方法【プログラミング学習149日目】](https://qiita.com/fuku_tech/items/a380ebb1fd156c14c25b]))

## MySQLで問題発生!
いろんなIT系の求人によく載っていたMySQLを今回は使用します。しかし
“`:ターミナル
mysql.server start
“`
すると
“`:ターミナル
Starting MySQL
.. ERROR! The server quit without updating PID

元記事を表示

郵便番号・都道府県別データをデータベースに保存する(Sqlite3)

# データの取得

今回は郵便局のサイトからデータをダウンロードします。
– 都道府県一覧 > 全国一括(1,691,560Byte)

[日本郵便:郵便番号データダウンロード](https://www.post.japanpost.jp/zipcode/dl/kogaki-zip.html)

> 全角となっている町域部分の文字数が38文字を越える場合、また半角となっているフリガナ部分の文字数が76文字を越える場合は、複数レコードに分割しています。
この郵便番号データファイルでは、以下の順に配列しています。
1. 全国地方公共団体コード(JIS X0401、X0402)……… 半角数字
1. (旧)郵便番号(5桁)……………………………………… 半角数字
1. 郵便番号(7桁)……………………………………… 半角数字
1. 都道府県名 ………… 半角カタカナ(コード順に掲載) (注1)
1. 市区町村名 ………… 半角カタカナ(コード順に掲載) (注1)
1. 町域名 ……………… 半角カタカナ(五十音順に掲載) (注1)
1. 都道府県名 ………… 漢字(コード順に掲載) (注1,

元記事を表示

未経験からITエンジニアになる〜ポートフォリオ作成〜

大学院を中退してITエンジニアを目指しています。
今回はエンジニア就活に必要なポートフォリオ作成について考えたことを備忘録としてここに残します。
# 何を作るか
現在は自身が所属していたアルティメットサークル(フリスビーを使うスポーツです)の反省用掲示板を作成しよう考えています。
現在も掲示板自体は存在しているのですが以下の点において改善したいと考えていました。

– トピックごとに分かれていない
– 有益な投稿に関してバックナンバーで振り返りづらい
– タグ付け機能がなく先輩の知恵を検索で探せない

そこで見た目や本来の掲示板機能を備えつつ、①トピックを設定、②お気に入り機能(いいね機能?)、③タグ付け機能を追加した掲示板を作成し、後輩たちに使ってもらいたいと思います。

# Qiitaの使用
何かやりだすと夢中で先に進んでしまうため振り返りの機会をもつためにQiitaに投稿を始めようと考えました。稚拙な文章力は表現力も向上できればなと思います。

今回はこの辺で、それでは!!

元記事を表示

【Rails】SQlite3から本番環境だけPostgreSQLに変更する方法をどこよりも優しく伝える!

# 目的
[Render.com](https://render.com/)というPaasを利用して本番環境にアップする際に、データベスはPostgreSQLが指定されていました。
RailsのデフォルトDBはSQlite3ですので、PostgreSQLに乗り換える必要があるということです。
本記事では、テストと開発環境はSQlite3のまま、本番環境だけPostgreSQLに変更する手順を記録します。

# 手順

## Rails newで新しいアプリを作成する
今回は最終的にRender.comにデプロイするところまで説明しますので、`Render_app`というアプリを作成します。

ターミナルにて
“`terminal
$ rails new Render_app

$ cd Render_app
“`

このタイミングで[GitHubにレポジトリを作成](https://qiita.com/ysk91_engineer/items/a87f95fbf76018963782)しておきます。

### 環境
私が作成したプロジェクトのバージョンは以下です。

“`t

元記事を表示

Railsの基礎を使って、メッセージ投稿アプリを作ってみた 【第4章】(7.Bootstrapでスタイルをつける)

## 概要
前回の記事で作成したアプリの続きです。
[Railsの基礎を使って、メッセージ投稿アプリを作ってみた 【第3
章】 (6.エラーの処理)](https://qiita.com/web_fumiya/items/9c5dec049e6fa754fddb)

今回が最終章となります。
Bootstrap FontAwesome を導入し、簡単に見た目の良いサイトに仕上げていきます。

## 開発環境
– Ruby 2.7.3
– Rails 6.1.6.1
– Postgresql

## 開発手順
1.アプリの作成 (第1章)
2.CRUD処理で簡単なメッセージ投稿アプリを実装 (第1章)
3.リファクタリング (第2章)
4.フラッシュの実装 (第2章)
5.バリデーションの設定 (第2章)
6.エラーの処理 (第3章)
7.Bootstrapでスタイルをつける (第4章)

## Boots

元記事を表示

Docker環境下でRailsアプリをHerokuにデプロイする手順

# 目的
Dockerfile, docker-compose.ymlを用いた開発環境でRailsアプリを構築したので、Herokuに手動デプロイする手順を備忘録としてまとめておくこと

# 前提
2022.9.27現在
後日CDで対応する予定のためHeokuの構成はheroku.ymlに記載、Dockerfileは開発環境のものとは分けて作成(Dockerfile.production)
## ミドルウェア
– Ruby 2.7.2
– Ruby on Rails 6.0.5
– docker 20.10.13
– docker-compose 1.29.2
– node 17.6
– PostgreSQL 14.5
– heroku 7.52.0(darwin-x64/node-v12.21.0)

## 構成
– API Rails(Rails.env=production)
– データベース PostgreSQLのみ
– フロントエンド Nuxt.js
– platform linux/amd64
– ディレクトリ
– MyApp(アプリ名)
– app

元記事を表示

“rails g”コマンドを叩いたらターミナルが固まってしまった時の対処法

はじめに

DBテーブルを追加する必要があり、”rails g model”コマンドを叩いたところ、ファイルが作成されずうんともすんとも言わなくなり固まってしまいました。

“ctrl + c”で終了したところ、下記のようにエラー文っぽいものが見当たらない文章が出力されて焦ったので、同じ場面の時に焦らないように備忘録にまとめようと思います。

~~~
~# bundle exec rails generate model ~
※↑ここで固まりうんともすんとも言わなくなる

※↓”ctrl + c”で下記が出力された(エラーっぽい単語が見えなくて焦りました。)
^C/usr/local/bundle/gems/spring-4.0.0/lib/spring/client/run.rb:117:in `gets’: Interrupt
from /usr/local/bundle/gems/spring-4.0.0/lib/spring/client/run.rb:117:in `verify_server_version’
from /usr/local/bundle/gems/

元記事を表示

Railsバージョンの問題解決

こんにちは!!

今回は**Rails6**のバージョンで開発を進めたいのに
**Rails7**のバージョンでしか開発ができない人に向けての記事になります!!!

**①ターミナルに以下のコードを入力**

“`ruby:ターミナル
gem install -v 6.1.5 rails
“`

**②バージョン6が入っているか確認**
“`ruby:ターミナル
rails -v
“`

以下のように表示されれば良き!!
*rails 6~のようになっていればなんでもいいよ!!
“`ruby:ターミナル
Rails 6.1.7
“`

**③アプリの作成**
“`ruby:ターミナル
rails _6.1.5_ new app_name
“`

以上になります!
開発頑張っていきましょう!!

元記事を表示

RailsエンジニアがRustでWebアプリを作るまで(1日目)

## 概要と注意
– 本記事は、完全未学習の状態からRustでAPIを書くまでの学習過程です。
– 筆者が普段主務で使っているのがRuby(Rails)のため、Railsに例えた比喩が度々出ます。
– Rustに関しての正確な説明はしていません。それどころか、間違った説明が度々出ます。あくまで学習の記録として読んでください。(訂正のコメントは大歓迎であります。)
– 習得したら、全ての過程を1つの記事にまとめます

## 1日目 (学習時間: 1h)

### Rustをinstallするよ!
兎にも角にもまずは環境を作らねばということで、Rustのinstall方法を検索
ありがたいことに[公式の日本語ドキュメント](https://www.rust-lang.org/ja/tools/install)があったので、書いている通りにinstall

“` sh
curl –proto ‘=https’ –tlsv1.2 -sSf https://sh.rustup.rs | sh
# 使っているshellでPATHを通す
“`
ふむ、はいったようだ
“`
> rustup

元記事を表示

Rails6, SQL Serverでinsert_allが使えない問題

Rails6でのSQLServerにて“`insert_all!“`は使えるが“`insert_all“`が使えなく、調査したのでメモ。
出るエラーは以下

“`Bash
Model.insert_all([{name: ‘test’}])
ArgumentError: ActiveRecord::ConnectionAdapters::SQLServerAdapter does not support skipping duplicates
“`

## 環境

“`lock
activerecord-sqlserver-adapter (6.0.0)
activerecord (~> 6.0.0)
“`

## Railsのコードを読む

結論を先に言うと、“`ActiveRecord#insert_all“`は以下で“`on_duplicate: :skip“`という主キーが重複するレコードをスキップする引数をデフォルトで渡しているが、“`activerecord-sqlserver-adapter“`ではこれをサポートしていないのが原因。

“`R

元記事を表示

OTHERカテゴリの最新記事