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

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

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

現在、討論するためのプラットフォーム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でカラム追加されていた様で
同じカラムが存在していると再度エラーになった。

# 対処法

元記事を表示

Ruby 練習問題2 ~二重ハッシュ~

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

今回は、Ruby練習問題シリーズの2回目です。
1回目より少しは難易度上がったかな、、?

それでは早速始めます!

# 問題
配列の内部に、複数のユーザーの情報をハッシュとして持つ変数user_dataがあります。
“`ruby
user_data = [
{user: {profile: {name: ‘George’}}},
{user: {profile: {name: ‘Alice’}}},
{user: {profile: {name: ‘Taro’}}},
]
“`
user_dataを利用して、全てのユーザーの名前だけが出力されるようにRubyでコーディングしてください。
ただし、出力結果は次のようになるものとします。
“`
George
Alice
Taro
“`

# 回答と解説

### 模範解答
“`ruby
user_data.each do |u|
puts u[:user][:profile][:name]
end
“`
もしくは
“`ruby
user_data.

元記事を表示

Docker + Rails + Remote-Containers【VSCode】

## Docker + Next.js + Remote-Containers

“`.devcontainer/devcontainer.json
{
“name”: “myapp-backend”,
“dockerComposeFile”: “../docker-compose.yml”,
“service”: “api”,
“workspaceFolder”: “/”,
“initializeCommand”: “ssh-add ~/.ssh/id_rsa”
}

“`
“`.devcontainer/Dockerfile
FROM ruby:3.1.2
ARG APP_NAME=myapp-backend
ARG USER_NAME=ruby
ENV RUBYGEMS_VERSION=3.3.10
ENV TZ=Asia/Tokyo

WORKDIR /${APP_NAME}

COPY Gemfile Gemfile.lock /${APP_NAME}
RUN gem update –system ${RUBYGEMS_VERSION} && \

元記事を表示

【Ajax】いいね機能を非同期通信で実装したいよ

# はじめに
ある投稿に対していいね機能を実装する際にAjaxを使って一部だけ情報更新を行いたい。
その際、とても苦労した部分について下記の記事にまとめたので、参照していただきたい。

https://qiita.com/vaza__ta/items/ef0cc701eabe863dfe91

下記テーブルは作成済み。
userテーブル
postテーブル
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |

# いいね機能にAjaxを実装
早速実装を開始する。
**完成図**
![完成図.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/06042a76-75c1-eb67-bd45-f40990

元記事を表示

【Rails】missing required keys: [:id]の原因と対策

# はじめに
ある投稿(postテーブル)に対して、いいね(favoriteテーブル)を削除する(destroyアクション)を実行すると、掲題のエラーが発生した。これについて、原因と対策を記す。

下記テーブルは作成済み。
userテーブル
postテーブル
favoriteテーブル
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |
# 原因: favoritesテーブルの主キー:idが渡せていない
rails routesでルーティングを見てみると、favoritesテーブルに主キーを渡さなければいけない。
“`言語名:ターミナル
post_favorite DELETE /posts/:post_id/favorites/:id(.:format) favorites#destroy
`

元記事を表示

簡単ログイン・ゲストログイン機能の実装でのエラーを解決:【No route matches [GET] “/users/guest_sign_in”】

# 環境
– 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)

# はじめに
https://qiita.com/take18k_tech/items/35f9b5883f5be4c6e104#%E3%81%9D%E3%81%AE2-%E3%82%B2%E3%82%B9%E3%83%88%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E6%A9%9F%E8%83%BD%E3%81%AE%E5%AE%9F%E8%A3%85%E6%96%B9%E6%B3%95

こちらの記事を参考にゲストログイン機能を実装した時に出たエラーを解決した

# 解決したい内容

ゲストログインをすると下記のエラーになる
Routing Error
No route matches [GET] “/users/guest_sign_in”

“`config/

元記事を表示

OTHERカテゴリの最新記事