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

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

seed_fuのseedメソッドの引数を活用すれば、似たデータが重複して新規作成されることもないし、idをわざわざ書く必要もないぞと気づいた

## 困ったこと
Railsのseed_fu、こういう風にidなどprimary keyを書くのを巷でよく見かけます。

“`ruby:db/fixtures/users.rb
User.seed do |s|
s.id = 1 # ←
s.name = “鈴木一朗”
s.email = “ichiro@example.com”
end

User.seed do |s|
s.id = 2 # ←
s.name = “鈴木二郎”
s.email = “jiro@example.com”
end
“`

idなんて自動採番されるんだから、書く必要なくない?ほら、削除してもデータ作れるじゃん!と無邪気にどや顔していたのですが、青二才でした。

確かにデータは作れます。しかしながら、seed_fuがいいのは、2回目以降流す時に、変更点だけを更新してくれるところ。primary keyを指定してあげないと、seed_fuはこれは既にあるデータだと判別できず、新しいデータをcreateしてしまいます。

とほほ。じゃあ、idを書いてあげて、変数をインクリメントしていく

元記事を表示

indexメソッド

# indexメソッド
文字列や配列の中に、指定した文字列が含まれていたとき、その文字列が何番目から配置されているのかを整数の値で返します。

## 例
“`ruby
str.index(検索したい文字列, [検索を開始する位置])
“`

indexメソッドの公式リファレンスはこちら。
https://docs.ruby-lang.org/ja/latest/method/String/i/index.html

# indexメソッドを使ってプログラムを作成します

任意の文字列に”code”が、左から何文字目に出てくるかを返し、その数を出力するメソッドを作りましょう。

呼び出し・出力例は以下のような形で行います。
count_code(“codexxcode”) → 1(ターミナルの返し)
count_code(“aaacodebbb”) → 4(ターミナルの返し)
count_code(“cozexxcode”) → 7(ターミナルの返し)

“`ruby
def count_code(str)
puts (str.index(“code”) + 1)

元記事を表示

【Rails】UUIDをプライマリーキーにする

## 概要

– ユーザーIDをUUIDにする必要性があったため、検証しました

## サマリー

– UUID型のデータ型を持つ、PostgreSQLにすると簡単に対応が可能
– mysqlではUUIDを生成するところから実装して、データベースにUUIDを入れるような運用になります

ということで、今回は、PostgreSQLで検証を進めます。

## 手順

Railsガイドによるマニュアル
[https://guides.rubyonrails.org/active_record_postgresql.html](https://guides.rubyonrails.org/active_record_postgresql.html)

こちらをベースに検証を進めました。

今回は、ユーザーテーブルに対して、プライマリーキーをUUIDにする、というケースで手順を記載します。

### ユーザーモデルの作成

“`json
$ rails generate model User sub:string
“`

※ column名は任意。今回は認証連携先のsubを格納する想定でsu

元記事を表示

Ruby scanメソッド

# scanメソッド
対象の要素から引数で指定した文字列を数え、配列として返します。

“`ruby
def count_hi(str)
puts str.scan(“hi”)
end
# 呼び出し例
count_hi(‘abc hi ho’)
“`

“`ruby
hi
# ターミナル出力
“`

scanの公式リファレンスです。
https://docs.ruby-lang.org/ja/latest/method/String/i/scan.html

# scanメソッドを使ってプログラムを作成します

以下条件です。
– 条件1:対象となる文字列の中から、”is”という特定の文字列の数を取得すること
– 条件2:上記で取得した数を出力すること

“`ruby
def count_hi(str)
puts str.scan(“is”).length
end
# 呼び出し例(引数には対象となる文字列を指定します)
count_hi(“This is a pen.”)
“`

“`
2
# ターミナル出力
“`

## 解説
今回は”is”という文字

元記事を表示

Ruby if, elseを使ったプログラム

# if, elseを使ってプログラムを書きます。
あなたは警官です。aとb二人の容疑者の取り調べをしています。このとき、次のルールで証言の真偽判定を行います。
※問題文で登場したaとb二人の容疑者は、今回実装するpolice_troubleメソッドの引数として取り扱っていきます。

条件は以下の通りです。
– 条件1:第一引数aと第二引数bどちらの証言も真(true)であれば、Trueを出力すること
– 条件2:第一引数aと第二引数bどちらの証言も偽(false)であれば、Trueを出力すること
– 条件3:第一引数aと第二引数bで証言の真偽が一致しない場合であれば、Falseを出力すること

“`ruby
def police_trouble(a, b)
if (a && b) || (!a && !b)
puts “True”
else
puts “False”
end
end
“`

# 解説
この問題は、論理演算子を用いて作成していきます。
下記参考までに。
“`ruby
# aもbもtrueの場合にtrue
a && b

# a

元記事を表示

rendering_optionsが見つからない時の対処方法:Rails 7 + Devise + Turbo

## Rails 7 + Devise + Turboを使うには
Rails 7のアプリでDeviseとTurboを使った時のパッチをいくつかのところで見かけました:

[【2023年版】Turboを有効化したままRails 7.0でDeviseを使う方法](https://qiita.com/jnchito/items/48db78c465493837c41f)
[Devise Auth Setup in Rails 7](https://betterprogramming.pub/devise-auth-setup-in-rails-7-44240aaed4be)
[How to use Devise with Hotwire & Turbo.js Discussion](https://gorails.com/forum/how-to-use-devise-with-hotwire-turbo-js-discussion#forum_post_17983)

こんな感じです:
“`ruby:app/controllers/turbo_devise_controller.rb
c

元記事を表示

AWS ECS + Rails + MySQL(Aurora) – 同じセキュリティグループに ECサービスとRDSを作成して RailsからDBアクセス可能にする

# 概要

同じセキュリティグループ同士は無条件に全てのトラフィックが許可されるので、ECSサービスもRDSも同じセキュリティグループに作成することでRailsからDBへのアクセスを可能にする

# Rails

scaffoldなどでDBアクセスが発生するページを作成しておく

“`
rails generate scaffold users name:string
“`

Productionでのデバッグ用に一時的に画面からエラー確認できるようにしておくと便利かもしれない

`rails-docker/config/environments/production.rb`

“`rb
Rails.application.configure do
config.consider_all_requests_local = true
“`

# VPCの作成

パブリックサブネット2個
プライベートサブネット0個

でVPCを作成する

image【Rails】部分テンプレートをアクションごとに挙動を変えたいときはcontroller.action_nameが便利

# どうした?
「表示が同じページは部分テンプレートを使う」
これはどんな教材でも言われている内容です。
よくある例として`new`ページと`edit`ページは`_form.html.erb`というファイルを用意して、`render`メソッドで呼び出すことで、投稿フォームをDRYに保ちます。

ただ、ほとんど同じだけどアクションによって表示の一部を変えたい時ってあると思うんです。
そんな時の対処法をアウトプットします。

# 手順
今回は、`new`ページと`edit`ページに対して`_form.html.erb`というファイルを用意し、ページタイトルをアクションごとに変えるというシーンを考えてみます。

## ビューファイル上で`controller.action_name`での条件分岐をする
`controller.action_name`は、現在のアクション名を返すメソッドです。
これを利用することで、`case`で条件分岐させてアクションごとに表示を変えることができます。

“`erb
<% case controller.action_name %>
<% when 'ne

元記事を表示

【Rails】モデルのカラムで選択肢を指定したいときはenumerize gemを使おう

# どうした?
ToDoアプリを作成しています。
各Todoに対して
* waiting(未着手)
* working(仕掛中)
* done(完了)

の選択肢を持った`status`カラムを付与する時に便利になりそうなenumerize gemを導入し、設定する方法をアウトプットします。

# 手順

## gemのインストール

Gemfileにenumerizeを記載します。
“`ruby
gem ‘enumerize’
“`
記載したら`bundle install`しましょう。

## モデルに選択肢を設定

**マイグレーションファイル**
マイグレーションファイルにて、Todoモデルに`status`カラムを付与する指示を与えます。
このとき、新規レコード作成時にバリデーションに引っかかるのを防ぐためにデフォルト値を指定すると良いでしょう。
“`ruby
t.string :status, null: false, default: :waiting
“`

**モデル**
モデルファイルで`status`の選択肢を配列形式で与えます。
Enumerizeモジュ

元記事を表示

docker-composeを使ってdocker化する方法(rails6×My SQL)

# 開発環境
* Mac (M1)
* Rails 6
* ruby 2.7.5
* mysql 12

# docker化する流れ
1\. 必要なファイルを準備

2\. コンテナイメージのビルド

3\. Rails プロジェクトを作成

4\. データベースの準備

5\. 必要なパッケージをインストール

6\. コンテナを起動

7\. 動作確認

## 1\. 必要なファイルを準備

### 空ファイルの準備

まずは rails-docker ディレクトリローカルの中に
以下の 5 つの空ファイルを作成しましょう。

Dockerfile
docker-compose.yml
Gemfile
Gemfile.lock
entrypoint.sh

“` touch {Dockerfile,docker-compose.yml,Gemfile,Gemfile.lock,entrypoint.sh} “`
上記のコマンドを入力するとファイルが一気に作成できます。
作成できたら、Gemfile.lock 以外の 4 ファイルを編集していきます。

### Dockerfi

元記事を表示

AWS ECS の production 環境に rails db:migrate する手軽な方法

RDSにはlocalから直接接続できるようにしておく
database.yaml などで必要な接続設定をしたらlocalからでも直接migrateを実行してしまえば良い

あくまで手軽な方法なので本番運用ではちゃんとやること
(ちゃんとの中身はまだ分からないのだが)

# コマンド例

“`
RAILS_ENV=production rails db:create
RAILS_ENV=production rails db:migrate
“`

# database.yaml の例

“`yaml
default: &default
adapter: mysql2
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000

production:
<<: *default host: *****.ap-northeast-1.rds.amazonaws.com username: username database: databasename password: passwor

元記事を表示

ransackのチェックボックスをtrue/falseで返したい

# はじめに
ransackのチェックボックスを使用した時にはまったのでメモを残します

# 前提
以下のadminテーブルに退職者カラムがあります。

“`
class Admin < ApplicationRecord endsuspended :boolean default(FALSE), not null end ``` ・endsuspended:true(退職している) ・endsuspended:false(退職していない) View で下記のようにチェックボックスを実装しようとしています。 チェック有り・・・全員表示 チェック無し・・・退職していない人だけ表示 ※初期表示は、チェック無しの退職していない人だけ表示させたい ``` = search_form_for @search, url: admin_admins_path do |f| = f.check_box :suspended_eq, checked: @suspended, class: "check-box" ``` # はまったところ Rancackでチェックボックスをチェックし

元記事を表示

RSpec長くなりがちなので短くしたい it_behaves_like

## 背景
Rspecで条件が一部違うが比べるところは大体同じみたいなテストが多かった

そこで `it_behaves_like` を使う

## 用途

テストのit部分を使いまわす

## 使用例

##### `it_behaves_like`使う前

“`Ruby
describe ‘仕事する’ do
subject { instance.test_suru_method }

let!(:instance){ Factory.no_yatu }
let(:target){ Factory.no_yatu }

context ‘conditionsが良いとき’ do
let(:conditions){ “good” }

it ‘仕事すること’ do
is_expected
expect(instance.published).to eq true
expect(instance.work).to eq (target.work)
expect(instance.conditions).to

元記事を表示

DockerでRails+React+dynamodb-local環境をつくりたい

# はじめに
以前にGo+React+MySQL環境をつくる記事を投稿したのですが、

https://qiita.com/does_not_exist/items/b79b3fd51ea6ef39df23

GoをRailsに、MySQLをdynamodb-localに変更する機会があったので簡単にまとめてみます。
Reactに関しては同じ手順になるので割愛します

# ディレクトリ準備
“`
sample-project
┣ docker
┃ ┣ backend
┃ ┃ ┗ Dockerfile
┃ ┣ react
┃    ┗ Dockerfile
┣ .env
┣ docker-compose.yml
“`

# ファイル準備

“`.docker/react/Dockerfile
FROM node

RUN apt-get update
“`

“`.docker/backend/Dockerfile
FROM ruby:2.7.5 as base
RUN apt-get update && apt-get install -y build-es

元記事を表示

テーブルを統合する

# はじめに
テーブルの統合することがあったので、手順を忘れないように記載します。

# 要件
approachesテーブルをinformationsテーブルへ統合する

# 目次

1. [カラム追加する](#カラム追加)
1. [データをコピーする](#データコピー)
1. [テーブルを削除する](#テーブル削除)



# カラム追加
approachesテーブルにしか存在しないのは以下です。
・mail_address
・facebook
・line

#### マイグレーションファイル作成
マイグレーションファイルを作成して、統合元テーブルにしか存在しないカラムを統合先テーブルに追加する

“`
rails g migration add_columns_to_informations
“`
#### マイグレーションファイル編集

“`
class AddColumnsToInformations < ActiveRecord::Migration[5.2

元記事を表示

rails7 devise action mailerにてパスワード再設定メールを送ろうとするとNil location provided. Can’t build URI.が出る件

## 前提条件
– Rails 7.0.4
– Devise 4.8.1
– actionmailer 7.0.4

## 事象
パスワード再設定用ページから宛先のメールアドレスを入力し、送信ボタンを押下すると下のエラー画面が表示される
![スクリーンショット 2023-02-07 12.18.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/1dad91ad-984a-59a4-c083-86a61924c4fa.png)

![スクリーンショット 2023-02-07 12.18.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411851/478ab7c8-1965-d3a4-44de-4037b00cc939.png)

## 対応
フォームのturboを無効化する

:::note warn
この対応は応急処置です!
Deviseの4.9.0のバージョンでは解決されるようですd(^_^o)

元記事を表示

Ruby slice!メソッド

# slice!メソッド
配列や文字列から指定した要素を削除し、削除したあとの要素を返します。
「 ! 」の付くメソッドは***破壊的メソッド***と言います。

## 破壊的メソッド
元の配列や文字列そのものを変化させてしまうメソッドのことを破壊的メソッドと言います。
ちなみに、調べてみると「 ! 」が付かない破壊的メソッドもあります。
勉強する必要がありますね!

## slice!メソッドの例

“`ruby
string = “おはようございます!”
string.slice!(2)
puts string
#=> “おはうございます!”
# 2番目の要素の「 よ 」が取り除かれて、返ってきた
“`

# slice!メソッドを使って任意の文字列を部分的に削除するプログラムの作成

条件は以下の通りです。
– 対象となる文字列からn番目の文字を削除すること
– 削除された文字以外の文字列を出力すること

“`ruby
def string(str, n)
str.slice!(n – 1)
puts str
end
# 以下は呼び出し例
string

元記事を表示

【備忘録】Ruby 2.7で RubyXLを使っているとFrozenError can’t modify frozen String: “” というエラーが出る

Ruby2.7のバージョンを2.7系に上げたときにRubyXLを使っているファイル内で“`FrozenError can’t modify frozen String: “”“`というエラーが出るようになりました。

#### 結論

rubyXLを3.4.11以上のバージョンに上げることで解消された。

#### 原因
調べてみるとrubyのバージョンを2.7にあげた時に、gemのバージョンが追いついておらず同じエラーが起きたという記事がありました。
Ruby2.7からnil.to_sがfrozen stringを返すようになったことが原因のようです。

以下のcommitで修正されたようなので、バージョン3.4.11以降であれば動くと思います。

https://github.com/weshatheleopard/rubyXL/commit/f0ed6a28dd4f5a1b39e64123be6dbfcdee439145

元記事を表示

[Rails]既存カラムのデフォルト値を変更する方法

# 前提
ユーザー(User)テーブルに管理者フラグ(admin_flag)があるとします。
今回はデフォルトをtrueからfalseに変更してみたいと思います。
*今回はboolean型を操作しますが数値/文字列でも同様に変更可能です。

“`
Table name: users

admin_flag :boolean default(TRUE)
“`

# 手順
## マイグレーションファイルを作成
デフォルト値変更のためのmigrationファイルを作成します。
今回はデフォルト値を変更するので
“`Change[カラム名]DefaltTo[テーブル名]“`
というマイグレーションファイル名にしています。

具体的には
“`rails g migration ChangeAdminFlagDefaultToUsers“`
でファイルを作成しました。

## マイグレーションファイルの中身を記述
実際に書くのは1行追加だけになります。
“`ruby
def change
# change_column_default :テーブル名, :カラム名, from:

元記事を表示

[Rails] タグ機能/タグ一覧ページの実装

# はじめに
タグ機能をgemを使わず、実装するための忘備録です。
設計は、中間テーブルを使うToxi法、といわれる形式で作成します。

# 実行環境
– Rails 7.0.4.1
– Ruby 3.0.4
– Devise 4.8.1

# 実装
### 1. アソシエーション
![タグ機能.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118527/ffe07c55-d7d6-7846-7247-1ba43c8615c7.png)
articlesテーブルとtagsテーブルを多対多でつなげます。
こうすることで、tagの編集をしたいときに、それぞれのarticleを編集する必要がなくなります。

注意する点は、articlesテーブルとtagsテーブルは親子関係にはなっていないことです。
そのため、modelに dependent: :destroyとつけても articleの削除と同時に、tagは削除されません。
>構造を考えれば、当たり前なのですが、articleを削除してもtagが消えず

元記事を表示

OTHERカテゴリの最新記事