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

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

【RSpec】createアクションに関するテスト(リクエストスペックでUserモデルとリレーションのあるデータが追加されるかをテストする)

# 前提
表を作成するアプリをRailsを使って作成しています。
作成した表は、作成者のみが閲覧・編集・削除できるようにしたいと思っています。

# やりたいこと
createアクションに関するリクエストスペックを書く。

# 書いたコード
“`ruby:spec/requests/tables_controller_spec.rb
describe”#create”do
context “as an authorized user” do
before do
@user = FactoryBot.create(:user)
end

it “adds a table” do
table_params = FactoryBot.attributes_for(:table)
sign_in @user
expect {
post tables_path, params: { table: table_params }
}.to change(@user.tables, :count)

元記事を表示

MySQLで「the user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist」というエラーが出る

## はじめに
開発環境にDockerを導入しようとして、なんやらかんやらいじっていたら、上記の症状が起きてしまいました。
具体的には、「rails serverを起動して、ローカルにアクセスする」、「MySQLを起動してshow databasesなどのクエリを実行する」などを行うとエラーになり、上記のエラーメッセージが表示されるようになりました。
~~~
mysql> show databases;
the user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist
~~~
今回は、このエラーを解決するまでの手順と、その途中で出くわした問題などを、自分の備忘録として、かつ同じ問題に遭遇した方へ少しでも助けになれるようにと思い、書き残していきます。

## 「mysql.infoschema’@’localhost」というユーザーを作成する

最初に、「the user specified as a definer (‘mysql.infoschema’@’localhost’) doe

元記事を表示

RailsのDateTime月の相対時間計算における、since関数と四則演算の結果の違いに注意

# 結論
**DateTime**におけるsince関数は現在の日付に **30日加算しているだけ** です。

例えば、1月31日の1か月後を求める場合以下のような違いがあります。
| 方法 | 結果 |
| —- | —- |
| .since(1.month) | **3月2日** |
| + 1.month | 2月28日 |
| next_month | 2月28日 |
| months_since | 2月28日 |

# 注意
これはDateTimeの場合だけです。Dateはすべて2月28日になります。

# プログラム例
“`ruby:irbの結果
# DateTimeクラスの場合はsince関数だけ結果が違います
a = DateTime.new(2022,1,31) # => Mon, 31 Jan 2022 00:00:00 +0000
a.since(1.months) # => Wed, 02 Mar 2022 10:29:06 +0000(!!!!!!!)
a + 1.months # => Mon

元記事を表示

FactoryBotをSeedで使う

# 結論
`require ‘factory_bot_rails’`をseedファイルの上部に記載することでFactoryBotが使えます。

“`ruby:seedファイル
# rquireが重要!!!わすれないで!!
require ‘factory_bot_rails’

# 例1:1個データを作る
FactoryBot.create(:parent, name: ‘親1’)
# 例2:いっぱいデータ作る
FactoryBot.create_list(:child, 5, name: ‘子’)
# 例3:戻り値を使って作ったデータを取得する & データをセットする
parent = FactoryBot.create(:parent, name: ‘親1’)
FactoryBot.create_list(:child, 5, name: ‘子’, parent: parent)
“`

# 事前準備
## Gem
Gemの`factory_bot_rails`が必要です。Gemfileに追記しましょう。

## Factory
上記例の場合、このような感じのFactoryが必

元記事を表示

【Rails】ランキング形式で投稿を表示する。(部分的にパーシャルの内容を変更)

# はじめに
投稿をランキング形式で表示する際に、テンプレートは流用しつつ、第1位、第2位、、、のような数字部分を変えていく動作を加える。

# 前提
下記は作成済み
ユーザーテーブル
マイクロポストテーブル
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |

# 基本
ただ投稿内容を繰り返し表示していくには、下記のコードでOK。
“`言語名:app/views/microposts/index.html.erb
<%= render @microposts %>
# => <%= @microposts.each do |micropost|%>
#     第○位
# <%= render partial: 'microposts/micropost', locals:

元記事を表示

【Rails】本番環境(heroku)でうまく動作しない。(メールでの本人確認)【Action_mailer】

# はじめに
開発環境である程度アプリケーションを作り、それをいざ本番環境で作るとなったとき、エラーになりうまく動かなかった。そこでherokuで正常に動作できるよう改善していく。

# 前提
デプロイしたところから開始する。

| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
| 4 | heroku | Heroku-20 |

# heroku の状況確認
herokuコマンドで原因を探る。
“`言語名:ターミナル
$ heroku logs
“`
▼エラーに対して、下記の記事を参考に解決していく。

https://qiita.com/kobayashimakoto/items/c7a96ea9f6cbc8d2da77

# 本番環境の設定
本番

元記事を表示

文字を入力しているのにvalidationが反応してしまう時

# 概要
“`ruby:記事を書くきっかけ(model)
validates :content, presence: true, length: { in: 1..140 }
“`
というvalidationを書いた後、
なぜか文字を入力しているのにvalidationが反応したため
解決に至るまでの経緯を記そうと思います!

# 経緯
プログラミングスクールのツイートアプリケーション作成課題に取り組んでいる際、
以下のバリテーションを実装しました。

・投稿内容に対して1 ~ 140字以内の文字数であること

ところが、上記のバリテーションを実装し開発環境のViewで確認したところ
実装したvalidationを満たす内容でもvalidationが反応して
エラーメッセージが出てしまうという部分で詰まったため本記事を書くに至ります。

# 原因
controllerのcreateアクションの記述が足りなかったことです。
※viewのformでsubmitしたパラメータをコントローラーで受け取っていなかった

# 解決に至る経緯
上述したvalidationが反応してしまうケースは

元記事を表示

sansanの1dayインターンに参加

## はじめに
sansanが開催する、Railsを使ったサーバーサイドのオフライン1dayインターンに参加しました。

1dayとは思えないほど濃く充実したインターンでしたので、それを紹介していきます。

## タイムライン
10:30-10:45
参加学生、サポーターの方々の自己紹介

11:45~11:30
会社紹介、本インターンで使う技術説明

11:30~12:30
休憩

12:30~17:00
ワーク

17:00~19:00
振り返り、質問タイム

19:00~19:30
オフィスツアー

### 参加学生、サポーターの方々の自己紹介
普段オンラインのインターンで開発はしているものの、オフラインでのインターンは初めてですごく緊張していました(大阪在住なので東京に行く時点で気が張ってました、、)。

ですが、みなさん優しくフレンドリーに接してくれてすぐに打ち解けることができました。

やはりほとんどの学生が関東在住でしたが、なんと同じ大学の人もいて親近感湧きました!

社員の方々はとても爽やかで、女性の方々は全員美人でした!

### 会社紹介、本インターンで使う技術説明

元記事を表示

Docker 開発・本番環境分け

はじめに

RailsアプリをDockerで環境を分けてbuildしようとしたときに詰まったことがありました。同じように詰まっている人の一助になればと思っています。

環境

macOS Big Sur 11.6.6
rails 6.1.6
Docker 20.10.7
docker-compose 1.29.2

原因

+ 開発・本番ともにDocker環境で構築
+ 開発・本番でシステム構成が異なるのでDockerfile、docker-composeの中身が違う
+ 開発から本番に移行する際に、Dockerfile、docker-composeの中身を本番に合うように変えた
+ 以降、開発環境でDockerが使えなくなった

解決

+ 開発環境用のファイルと本番環境用のファイルをそれぞれ用意する(自分的に一番簡単な方法だった)

システム構成

開発環境(本番との違い: Nginxを使っていない、PostgreSQLのDockerイメ

元記事を表示

default_scopeを使わずにorderメソッドでオブジェクトの並び順を変更する

# はじめに
default_scopeについて調べていると、「default_scopeは使うな」「default_scopeは非推奨」というワードが目に入りました。
今回はdefault_scopeを使わずに、orderメソッドでオブジェクトを新しいものから古い順に並び替えます。

### default_scope
“`models/post.rb
class Post < ApplicationRecord belongs_to :user default_scope -> { order(created_at: :desc) }
validates :user_id, presence: true
end
“`

“`posts_controller.rb
def index
@posts = Post.all
end
“`

“`posts/index.html.haml
%ul
– @posts.each do |post|
%li
= post.title
= post.created_at
“`
新しい

元記事を表示

Rails6からRails7へのアップデート手順(Rails6.1.4.7→Rails7.0.3)

Rails6からRails7へのアップデートメモ
===================================

今更ですが、rails4からrails7までアップデートする必要があったため
[Rails4→Rails5](https://qiita.com/t_mapico/items/ddf423113225ac45b033)
[Rails5→Rails6](https://qiita.com/t_mapico/items/4865a33b03219c99abfd)
Rails6→Rails7
のアップデートで手順をまとめていきます。

ここではRails6→Rails7の手順を書いていきます。

## 事前準備

### testが通るようにしておく
testを通るようにしておくと、アップデート後に、どこがエラーになるのか確認しやすいです。
事前にtestが全て通るようにしておきましょう。

### Ruby Version
今回はRuby 2.7.5 で対応してます

## Railsをアップデート

### gemfileの修正

gemのrailsのバージョンを

元記事を表示

GoogleCloudRun初心者がRailsのデプロイでつまづいたエラー7種

# この記事は

これは、普段AWS ECSを利用している筆者が、手元のRailsアプリでGoogle Cloud Runを試したら思いのほか手間取った話。慣れればCloud Runは推せる?

# やりたかったこと

ターミナルで華麗にデプロイ

# 前提

* ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [-darwin21]
* Rails 7.0.3
* Google Cloud SDK 393.0.0
* Docker Image ruby:2.7-alpine
* ProductName: macOS
* ProductVersion: 12.4

# 参考にした手順と発生したエラー
* [Cloud Run 環境での Rails の実行 | Ruby | Google Cloud](https://cloud.google.com/ruby/rails/run?hl=ja)
(Cloud Build は未使用)

## Error 1: NoMethodError: undefined method `size’ f

元記事を表示

【Rails】コードレビューですぐに役立つTips集

レビューする時もされる時も、似たような箇所が指摘されてきたので、まとめてみました!
(リーダブルコードも買ったから、あとで読んで追記していきたい。)

## 【Tips1】 命名大丈夫?
https://qiita.com/jnchito/items/459d58ba652bf4763820

## 【Tips2】 説明的なコメント❌WHYに答えるコメント⭕️
https://qiita.com/jnchito/items/459d58ba652bf4763820

## 【Tips3】 エラーハンドリング足りてる?
– 関連質問
– そこのfindでnilが渡されても大丈夫?
– params[:hoge]がnilでも大丈夫?
– rescueしなくていいの?
– 対処法
– `return if hoge.nil? `などで、途中で返す
– `hoge&.id`を用いる
– [Railsアプリにおけるエラー処理の考え方](https://qiita.com/jnchito/items/3ef95ea144ed15df3637)

#

元記事を表示

【Ruby】mapで回す必要ある?

リファクタのメモです。
間違っていればご指摘お願いします!

# 背景
今回りファクタするコードが最終的に行いたいことは、過去の各商品の2つの値とある各商品の2つの値を比較です。
そのために、preivous_itemsを定義しています。
(元のコードを編集しているので、細かいところは、気にせずでお願いします。)
“`ruby
def check_sample
previous_items = items.map do |item|
next if item.quantity.zero?
[item.user_id, item.quantity]
end

new_items = new_sample.items.group(:user_id).count
# [[user_id,quantity],[2,4],[3,0]] == [[1,3],[2,4],[3,0]]
preivous_items == new_items
end
“`

# 元のコード
“`ruby
previous_items = items.map do |item

元記事を表示

[Ruby] 配列の結合と展開

Rubyによる、配列を結合し展開する処理について調べていみました。
間違っていればご指摘お願いします!

# 元のコード
今回は下記のコードをリファクタして、ベンチマークを計測しながら比べていこうと思います。
計測方法は[こちらの記事](https://qiita.com/scivola/items/c5b2aeaf7d67a9ef310a)を参考に計測していきます。
“`ruby
def nomal(items)
name_array = []

items.each do |item|
name_array.push([item[:id], item[:name]])
end

name_array.flatten
end
“`

## 計測コード
“`ruby
require ‘benchmark’

n = 10
items = 100.times.flat_map do |i|
[id: i, name: “山田#{i}”]
end

Benchmark.bm(10) do |r|
r.report “no

元記事を表示

[Ruby] 配列の結合について

Rubyによる配列の結合処理について調べていみました。
間違っていればご指摘お願いします!

# 計測コード
“`
require ‘benchmark’

n = 10000
y = 10
hoge_array = Array.new(y, “hoge”)

Benchmark.bm(10) do |r|
r.report “flatten” do
n.times{ [hoge_array, hoge_array, “hoge”].flatten }
end

r.report “splat” do
n.times{ [*hoge_array, *hoge_array, “hoge”] }
end

r.report “+” do
n.times{ hoge_array + hoge_array + [“hoge”] }
end
end
“`

# ベンチマーク
“`
n = 10
y = 10
user system total real
flatten 0.000055 0.000

元記事を表示

【Rails】外部APIを使う方法

# 初めに

`Rails`で外部 API を利用するには、gem や`NET::HTTP`を使う方法がありますが、今回は`Ruby`にある`NET::HTTP`を使います。

# HTTP リクエストの仕方

以下は、`Net::HTTP`を利用して[PokeAPI](https://pokeapi.co/)からポケモンのデータを取得する例です。
`https://pokeapi.co/api/v2/pokemon/:id`に対して、`GET`メソッドでリクエストを送信します。
そして、json データを受け取ります。

“`ruby:api_controller.rb
require ‘net/http’

class ApiController < ApplicationController def show pokemon_id = params[:id] uri = URI.parse('https://pokeapi.co') # URI.parseは、URIオブジェクトを生成するメソッドです。 http_client= Net::HT

元記事を表示

RailsのREST設計のヒント集

# 参考URL
– まずはRailsガイド
https://railsguides.jp/routing.html

– TechRachoの記事
RESTの基本概念からRailsのルーティング作法まで書いてあります。一通り読んで見るのをおすすめします
[Railsのルーティングを極める(前編)](https://techracho.bpsinc.jp/baba/2020_11_18/15665)
[Railsのルーティングを極める (後編)](https://techracho.bpsinc.jp/baba/2020_11_20/15619)

– DHH流ルーティング
サブアクションとフィルタリングパターンについて
[DHH流のルーティングで得られるメリットと、取り入れる上でのポイント](https://tech.kitchhike.com/entry/2017/03/07/190739)
[DHHはどのようにRailsのコントローラを書くのか](https://postd.cc/how-dhh-organizes-his-rails-controllers/)

# 最初に

元記事を表示

間違えてmigrateした時の対処法について(初心者向け)

ポートフォリオ作成中に間違った`マイグレーションファイル`を`migrate`してしまった。
恐らく、今後も同じ様な失敗をすると考えられるため忘備録として記事にしました。

そもそも`モデル`、`マイグレーションファイル`、`マイグレーション`とは

__Model__ (名): _(服装品・自動車などの)…型、雛形_
__migration__ (名):_移住、転住、渡り、移住者群、移動する動物の群_
__migrate__ (動): _(…へ)移住する、定期的に(…に)移動する、渡る_
__マイグレーションファイル__:_データベースの更新処理を行う設計図のようなもの。これをmigrateすれば、SQLを書かなくてもデータベースにテーブルが設計できる。_

### つまり
– `モデル`は __主に__ データベースのデータのやり取りを行う`機能`を担っている。
– `マイグレーション`はSQLを書かなくてもデータベースの構造を操作できる`便利な機能`のこと。
– その操作して`反映する作業`を`migrate`といい。
– `マイグレーションファイル`は反映する内容が書い

元記事を表示

Bootstrap5系でのModalについて

## はじめに
Bootstrap5系を用いてモーダルを比較的簡単に実装できますが、記述するタグが多く、テキスト化して整理しておくことが必要だと考えました。
そこで、備忘録的に記事に残しておくことにしました。

## 実装環境
– Bootstrap 5.0.2
– Ruby 2.6.3
– Rails 6.1.6

※他の言語でも問題なく動くと思いますが、本記事ではRailsで動作確認をしております。

## モーダルとは
そもそもモーダルとは何かという説明をしますと、画面に設置されたボタンをクリックすることで、他の画面に遷移することなく、ポップアップでウィンドウが表示されるものです。設置することでUI/UXの向上につながります。

## Bootstrapでの実装方法
まず、はじめに全体の記述を示します。
以下の記述でモーダルを表示することができます。
ボタンとモーダル本体で構成されています。
“`html:modal.html.erb

元記事を表示

OTHERカテゴリの最新記事