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

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

Neovim内でのRSpec実行環境をneotermで簡単に導入する

# 前書き
Vim(Neovim)で開発をしている方、RSpecの実行どうしてますか?
参考までに私の試行錯誤遍歴を?‍♂️
– iterm2の画面分割で常にRSpec用の画面を確保しておいてRSpec実行時にウインドウ移動
常に画面領域を圧迫して邪魔(他にログ表示用やrails console用の領域を使いたいならなおさら)
VSCodeみたいに使いたいときにだけ表示したい!

– `C-z` でVimから抜けてターミナルでRSpecを実行する
一応使いたい時だけ表示することになるので画面は圧迫しないが都度Vimから抜けるのはストレス
再度Vimに戻った後にRSpecの実行結果をまた見たい時はまた `C-z` しないと見れないのが面倒

– Neovimのターミナルモードを使う
Neovimだと `:terminal` コマンドでターミナルモードに入れるのでVSCodeに近い感じには出来るが、どうも操作性が悪い
設定を結構ゴニョゴニョしないと使い物にはならないなという印象(設定弄る前に次に紹介するneotermを知ってしまった)

– **neotermを使う**
色々試して行き着い

元記事を表示

[ポリモーフィズムとは?]具体例で考える

## こんな人に読んでほしい
– ポリモーフィズムって言葉は聞いたことがある
– ググってもイマイチわからない
– 具体例を出して説明してほしい

## 具体例
ここはブック○フ。最近は、本も洋服もゲームも売っている。

こことコンビニさえあれば、一生生きていけるなぁ、
そんなことを思っていた矢先、在庫を管理するシステムの設計を任された。

先輩 「まず、在庫の情報を出力するコードをかいてね☆」

さぁ、こんなときどんなコードを書きますか??

## ポリモーフィズムを一言でいうと
ポリモーフィズム(多態性)の文字通り、同じメソッド名なのに、
クラスによって実行結果が変わる

## 今回の例でいうと
Itemを継承しているBook、GameSoft、Clotheにおいて定義したprintメソッドがあり、それを呼び出すと、それぞれの子クラスに合わせて違う結果を返してくれる

## 情報の整理
– 在庫(stock)にある商品(item)には全て、title, price, categoryがある
– 商品の種類は3種類
– 本(book): 著者(author)の情報がある

元記事を表示

eachの危険性を体で覚えて、その代替手段を知る(Ruby, Rails)

# やっちまった
話を単純化してお伝えすると、1万件以上レコードがあるusersテーブルに対して、`is_active`というカラムがあって、全員trueにしたかったです。

これを実現するのに、**全usersに`each`をかけて`update_column`する処理を仕掛けたら、本番のサーバーを一瞬死なせてしまい、めちゃめちゃ焦りました**。

“`ruby
User.all.each do |user|
user.update_column(:is_active, true)
end
“`

`User.all.each`すると、該当するレコードを全て取得してきて、メモリに置いて処理をするので、それで激烈に重くなってしまうようです。この場合、Userのインスタンスを1万件以上取得して配列にしてそれをメモリにドーン!と置いて処理しようとしたので、それがメモリを強烈に圧迫してしまったみたい。

# 解決策1:`find_each`を使う
この時の対処方法の1つが`find_each`を使うこと。

これはレコードを持ってくる数に制限をかけながら処理を実行するので、メモリへの

元記事を表示

Ruby 練習問題3 ~クラスとインスタンスの概念を用いたコードの作成~

こんにちは、プログラミング初学者”fujitacoma”です!

今回は、Ruby練習問題シリーズの3回目です。
前回まではハッシュ問題でしたが、今回はクラスとインスタンスの問題です!

それでは早速始めます!

# 問題
“`ruby
class Article

def initialize(author, title, content)
@author = author
@title = title
@content = content
end

end
“`
上記のコードに追加を行い、以下の出力結果を得られるようにしてください。
ただし、クラスとインスタンスを使用するものとします。
“`
著者: 阿部
タイトル: Rubyの素晴らしさについて
本文: Awesome Ruby!
“`
# 回答と解説
### 模範解答
“`ruby
class Article

def initialize(author, title, content)
@author = author
@title = title
@con

元記事を表示

Gem prown を使用して請求書を作成する。

はじめに

本記事は オリジナルアプリ Kiyoraの続編となります。
プログラミングスクールで作成したオリジナルアプリケーションで作成した
Ruby on Railsでのpdf出力について取り上げます。

—-

実行環境
rails 6.0.3
ruby 3.0.1
psql (PostgreSQL) 14.2

前提
rails newでアプリ作成
rails db:create を実行済み。

prownの導入

gemファイルに以下を追加します。
テーブルも表示させたいのでprown-tableもインストールします。
“`
gem ‘prawn’
gem ‘prawn-table’
“`

実行コマンド
“`
bundle install
“`

モデル作成
—-
“`
rails g model invoice_pdf
“`
コントローラーを作成

“`
rails g controller invice_pdfs
“`

ルーティングの設定

showの画面でPDFを表示

“`ruby
resources :invo

元記事を表示

グループやルームの管理者が誰かわかるようにする

現在、討論するためのプラットフォームWebアプリを開発してます。そこで、ユーザーAが管理者となって討論ルームを作成し、そのルームに複数のユーザーが参加するわけですが、その仕組みを作る方法についてアウトプットします。方法は知っている限り2つあります。

1つ目はルーム作成者(=オーナー)を管理するためのテーブルを他に作る方法。
2つ目はルームテーブル内にオーナーを管理するためのカラムを追加する方法。

今回は2つ目の方法について、特に難しかったアソシエーションを中心に解説します。難しかった原因は「ユーザーとルームは多対多のアソシエーションであるのにも関わらず、オーナー管理の部分だけ見るとユーザー:ルームは1:多の関係になってしまうことです(ルームには必ず1人だけ管理者が存在し、ユーザーは複数のルームの管理者になれる)」というものです。解決方法を要約すると、「ユーザーとルームの多対多アソシエーションを作成するのに加え、ルームからユーザーへblongs_toのアソシエーションを組む」となります。

1つ目の方法の概要やメリットについては最後におまけで少しだけ言及します。
# 前提
### 機

元記事を表示

Mysql2::Error: Cannot delete or update a parent row: a foreign key constraint fails

Herokuへデプロイ中にタイトル通りのエラーが発生しました。

# 原因
おそらく、テーブルのカラムを変更したことです。ローカル環境では、rails db:rollbackでしっかりとテーブルをダウンさせた上で、テーブルの設計を変更していましたが、heroku上でrollbackすることまで考えが及ばなかったです。

# 解決
①手っ取り早く、Heroku上でテーブルをリセットします。
“`:ターミナル
heroku run rails db:reset
“`
注意点:リセットすると、登録されていたデータが全て消えます。

②以下のエラーが発生します
“`
rails aborted!
ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your ‘production’ database.
If you are sure you want to continue, run the same command with the environ

元記事を表示

管理者機能実装後におけるデプロイ時の注意点

こんばんは、プログラミング初学者”fujitacoma”です!

今回は、以前に投稿しました記事、
”管理者ユーザー機能の実装[Ruby, Rails]”の後日談のようなものを、
備忘録として書いていきたいと思います!

”管理者ユーザー機能の実装[Ruby, Rails]”はこちらからどうぞ↓
https://qiita.com/fujitacoma/items/974d18fbebf8c73c411c

# はじめに
使用クラウドサービスはHerokuです。

# 起こったこと

それは、管理者ユーザー機能を実装及びデプロイ完了後に、
嬉々として本番環境で確認をしようとした際に起こりました、、

管理者用のアドレスとパスワードでログインできない、、、!!
冷や汗。

# 原因調査
なぜ?意味なく開発環境のdbも確認する。
ちゃんと管理者用のアドレスとパスワードは保存されている。(当然)

db/seed.rbに管理者ユーザー情報が記述されているか確認する。

次はデプロイのログを隅々まで確認する。
ちゃんと、
“`
git push heroku master
“`

“`

元記事を表示

railsでsorceryをbundleしたらoauth2をアップデートしてくださいと言われた

先日`rails`で`sorcery`を使おうと思い、`Gemfile`に追加して`bundle install`を実行したところ、「インストールされている`oauth2`のバージョンがもうサポートされていないのでアップデートしてください」と言われ少し詰まったのでまとめました。

## 環境
Rubyバージョン 3.1.2
Railsバージョン 6.1.6

## 詳細
`Gemfile`に`sorcery`をバージョンを指定せず追加

“`ruby:Gemfile
# 追加
gem ‘sorcery’
“`

`bundle install`を実行したところ以下のようなメッセージエラーが出ました。
“`shell:ターミナル
% bundle install
You have installed oauth2 version 1.4.10, which is EOL.
No further support is anticipated for the 1.4.x series.

OAuth2 version 2 is released.
There are BREA

元記事を表示

[Rails]Gem: redis-mutex

# 前提
– 排他制御: 同時処理を防ぐ仕組み(参考: https://wa3.i-3-i.info/word11316.html)で、セマフォで実現。
– セマフォ: 同時処理可能なプログラム数を管理する仕組み(参考: https://wa3.i-3-i.info/word13357.html)
– ミューテックス: 0~1しかないセマフォで、デッドロックを防止する仕組みが組みこまれているもの(参考: https://wa3.i-3-i.info/word13360.html)。排他制御で使われる。
– ブロッキング・ノンブロッキング: ざっくりとは同期処理・非同期処理のこと。

# 概要 [gem「redis-mutex」](https://github.com/kenn/redis-mutex)
Redisを使ったRubyでのミューテックス。
同期処理・非同期処理ともにサポート。
例えば以下のように使う。
“`
# [引数]
# – lock_name: ロック名
def sample_process(lock_name)
# ロック名「lock_name

元記事を表示

【Ruby on Rails】検索機能追加

# 開発環境
Rails 6.1.4.1
ruby 2.6.3

# 前提条件
– devise導入
– Bootstrap導入
– Userモデル、Bookモデル実装済み
– ユーザー一覧表示と投稿一覧は部分テンプレートで作成済み

# 目次
– コントローラー作成
– ルーティング
– モデル定義
– View作成

## ①コントローラー作成
まずは検索機能のコントローラーを作成します。
同時にコントローラーアクションも作成します。

“`ruby:ターミナル
$ rails g controller searches search
“`

searchesコントローラーのsearchアクションを定義します
“`ruby:searches.contoroller.rb
class SearchesController < ApplicationController before_action :authenticate_user! def search @range =params[:range] @word =params[:word]

元記事を表示

before_actionが動かない?アクション名に予約語を使うと動かないので注意

## ハマったこと

以下のようなコードでbefore_actionのメソッドが動かず、少しハマりました

“`
class Api::FriendsController < ApplicationController before_action :authenticate_account def request Friends::RequestService.new(@api_user, @target).call render "request", formats: "json", handlers: "jbuilder", status: 200 end end ``` ## 原因と解決方法 action名をfriend_requestに変更したところ、動きました 軽く調べたところ、requestはRailsの予約語らしく、関数名に指定しないほうがいいとのことでした ``` class Api::FriendsController < ApplicationController before_action :authenticate_a

元記事を表示

【Rails】link_toで移行先のアクションにパラメータを渡す方法

# 環境
– Mac(12.2.1)
– MacBook Pro (13-inch, 2020)
– 2 GHz クアッドコアIntel Core i5
– 16 GB 3733 MHz LPDDR4X
– ruby (3.0.0p0)
– rails (7.0.1)

# 解決したい内容
[Rails link_toにパラメータを渡す](https://qiita.com/k_fence/items/c51bfdce8ce7b32515a3)

link_toを使ってgetsでコントローラにパラメータを受け渡したい

やりたいこと

view側からコントローラにリンクする際に、値を受け渡したい

以下のようにパスの引数にハッシュの形で追加してやる

※例)top/indexからtop/link1へ値を渡す場合

“`erb:top/index.html.erb
<%= link_to "リンク1へ", top_link1_path(name: "piyo") %>
“`

パラメ

元記事を表示

【Rails】【メモ】記事削除をしたときに、destoroyメソッドが効かなかったときになんとかした時の対処方法

# 環境
– Mac(12.2.1)
– MacBook Pro (13-inch, 2020)
– 2 GHz クアッドコアIntel Core i5
– 16 GB 3733 MHz LPDDR4X
– ruby (3.0.0p0)
– rails (7.0.1)
– mysql2 (0.5.3)

# はじめに

# 前提知識

# 解決したい内容
下記の削除ボタンを押したときに下記現象が起きた
・dstroyメソッドが効かず、GETメソッドを取得し、同ページに移動するだけ
・createメソッドが反応してしまい、各スコアが0のパターンの診断結果が記録される

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747746/5a953e9c-609f-1e4e-e601-ae005da0d6d7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/747746

元記事を表示

【Rails】【メモ】Kaminariの使い方

# 環境
– Mac(12.2.1)
– MacBook Pro (13-inch, 2020)
– 2 GHz クアッドコアIntel Core i5
– 16 GB 3733 MHz LPDDR4X
– ruby (3.0.0p0)
– rails (7.0.1)
– mysql2 (0.5.3)

# 内容

通常は
“`egograms_controller.rb
@index=EgoScore.page(params[:page]).per(3)
“`

のようにpageメソッドをしようするだけでページネーションをつくることができる

findやwhereを使用している場合はKaminari.paginate_arrayを使用

“`egograms_controller.rb
@index=Kaminari.paginate_array(index).page(params[:page]).per(2)
“`

“`egograms/index.erb
# 表示したいviewに追記
<%= paginate @index %>
“`

元記事を表示

【Rails】【メモ】carrierwaveの使い方

# 環境
– Mac(12.2.1)
– MacBook Pro (13-inch, 2020)
– 2 GHz クアッドコアIntel Core i5
– 16 GB 3733 MHz LPDDR4X
– ruby (3.0.0p0)
– rails (7.0.1)
– mysql2 (0.5.3)
– carrierwave (2.2.2)

# はじめに
以前、できなかったが今回できた
# 前提知識
deviseを使用した上でのお話です

# 解決したい内容

ドキュメント通り進めていく

“`
gem install carrierwave
“`

“`Gemfile.rb
gem ‘carrierwave’
“`
サーバーを再起動

# carrierwaveの設定
Uploaderクラスを追加
ここではAvatarという名前にしているのが、好きな名前で良い
“`

rails generate uploader Avatar
“`

“`app/uploaders/avatar_uploader.rb
class AvatarUploa

元記事を表示

【Rails】railsのActiveRecordで最新のレコード1件取得する

# 環境
– Mac(12.2.1)
– MacBook Pro (13-inch, 2020)
– 2 GHz クアッドコアIntel Core i5
– 16 GB 3733 MHz LPDDR4X
– ruby (3.0.0p0)
– rails (7.0.1)
– mysql2 (0.5.3)

# はじめに

# 前提知識

# 解決したい内容
egoscore=EgoScore.where(user_id: current_user.id).pluck(:cp_score,:np_score,:a_score,:fc_score,:ac_score).flatten
# 改善策

下記コードを追加する
`order(updated_at: :desc).limit(1)`

“`
egoscore=EgoScore.where(user_id: current_user.id).order(updated_at: :desc).limit(1).pluck(:cp_score,:np_score,:a_score,:fc_score,:ac_score)

元記事を表示

【メモ】Rilas:sqlのバックアップとリストア、ローカルDBをEC2にインポート

# 環境
– Mac(12.2.1)
– MacBook Pro (13-inch, 2020)
– 2 GHz クアッドコアIntel Core i5
– 16 GB 3733 MHz LPDDR4X
– ruby (2.7.5)
– rails (7.0.1)
– mysql2 (0.5.3)

## バックアップ

“`:ローカル
$ mysqldump -u ユーザー名 -p -t データベース名 テーブル1 テーブル2 … > ダンプファイル名
“`

“`:ローカル
$ mysqldump -u root -p PF_development posts > test.sql
“`

テーブル名を記述しない場合は全てのテーブルをバックアップ
拡張子はcsvなど、使用したいものに変更可能

## リストア
“`:ローカル
$ mysql -u ユーザ名 -p データベース名 < ダンプファイル名 ``` ```:ローカル $ mysql -u root -p PF_development< test.sql ``` ※ダンプファイ

元記事を表示

「完全に理解した」状態の僕が「チョットワカル…」になるまでのとある企業の新人研修 part.3

▼part1こちらから▼
https://qiita.com/kobayashimakoto/items/4fe942815c7fc941821f

▼part2こちらから▼
https://qiita.com/kobayashimakoto/items/ca131b8fbe8007a18f00

こんにちは
part2でご紹介した、~~社内でのボッチ生活を解決する~~ サービス **TeaTime** についてのお話です。

リリースして困ったことや、実際に運用してみてどうだったのかをご紹介します。

# そもそもTeaTimeって?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/654ccc04-4980-aa6b-d197-c387034e71fd.png)
ざっくり言うと、アプリに登録さえしといたら、
登録者の間でいい感じにお茶会をセッティングしてくれて
そのお茶会に参加することで、**仲良くなれる機会を得る**というサービスです。

▼作った時の話はpart2を

元記事を表示

Mysql2::Error: Duplicate column name ‘xxxx’が出たときは既にあるカラムを消そう

# 背景
あるテーブルに3つのカラム追加する実装。

## 一度migrateでエラー
“`zsh
$ rails db:migrate
Mysql2::Error: Unknown column ‘xxx’ in ‘zzz’: ALTER TABLE `zzz` ADD `xxx` varchar(255) COMMENT ‘xxx’ AFTER `xxx`
“`

原因としてあるカラムを追加する際に、afterを使用してカラム位置を指定したが、その指定したカラム名を間違っていたためエラーを吐いていた。

再度、カラム名を修正してmigrateすると

“`zsh
$ rails db:migrate
Mysql2::Error: Duplicate column name ‘xxx’: ALTER TABLE `zzz` ADD `xxx` varchar(255) COMMENT ‘xxx’ AFTER `zzz`
“`

エラーを吐いていたが、エラー前に実行されたadd_columnでカラム追加されていた様で
同じカラムが存在していると再度エラーになった。

# 対処法

元記事を表示

OTHERカテゴリの最新記事