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

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

Create Factory Bot instances out of rspec

If you want an instance created by Factory Bot, say in a rails console, follow this.

“`rb
$ bundle exec rails

> class Object
> include FactoryBot::Syntax::Methods
> end

> create(:user)
“`

元記事を表示

rails db:seedできなくなった

# rails db:seed できなくなった
## rails db:seed とは
Railsには、初期データを追加するためのシード機能が備わっており、「seed.rb」ファイルにデータを記述していきます。
例えば、
“`
Customer.create!(
email: “aaa@amail.com”,
password: “a12345”,
nickname: “れいこ”,
profile: “令和生まれの道子です。”,
)
“`
こんな感じでCustomersテーブルのそれぞれのカラムにデータを保存(create!)します。
このような記述の集まりが、「seed.rb」ファイルで、それを実行するのが、“`rails db:seed“`というわけです。
## エラー
rails db:seedをすると、既にemailがデータベースにあるようで、バリデーションエラーとなりました。
## TRY
1. x
“`
rails db:reset
rails db:seed
“`
2. x
“`
rails db:drop
rails db:migrate
rail

元記事を表示

エンジニアならこの問題、解けるよなぁ?!

どうも。タイトルほどの威勢はありません。
ということでTwitterみてたら我らがしみけんさんがこんなツイートしてた。
mojikyo45_640-2.gif

簡単にいうと、コインを100回投げて、裏表を10*10マスに文章の横書きの順番で記録してこい。ただし捏造しても良い。というものだ。
で?って話なんだけどこの課題を出した教授は捏造されたものを簡単に見分けたのだとか。
じゃあどうやって見分けたんだ?ってのが面白そうだったから考えてみて、そしてエンジニアらしくプログラムを組んでみた。
読み進める前に、ちょっと考えてみて欲しい。
##

元記事を表示

過去問共有サービス Univer の開発を行いました。

![スクリーンショット 2022-06-19 22.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1667538/97698656-b2fb-4cfa-b054-c09ded52b39f.png)

過去問共有サービスUniverです。企画からデザイン、デザインに至るまで一気通貫して一人で行いました。

https://universitycommunity.herokuapp.com/

[開発背景]
開発の理由は二つあります。
一つ目の理由は、コロナの影響で縦と横のつながりが薄くなり、過去問が手に入りづらくなったという学生の問題を解決するためです。
また私自身の周りにそういった悩みを抱えている学生の方が多くいたことから、ユーザー数が期待できるため、多くの方のフィードバックを通じてより質の高いサービス開発に取り組めると考えたからです。

[実装機能]
投稿機能、画像投稿機能、ログイン・ログアウト機能、フォロー機能、いいね機能、コメント機能、お気に入り登録機能、検索機能など、SNSに利用

元記事を表示

Your Ruby version is 2.7.3, but your Gemfile specified 2.7.5 と表示されるエラーの解決

はじめに

ロリポップマネージドクラウドを使い自作アプリをデプロイしようと思い

`git push lolipop master`

を行うと

`remote: Your Ruby version is 2.7.3, but your Gemfile specified 2.7.5`

というエラーが起きた。

エラーについて

エラー内容を直訳すると

`あなたのRubyは2.7.3なのに、Gemfileには2.7.5となっている。`

という事だがGemfileを確認すると2.7.3になっており、他にもGemfile.lock、.ruby-versionを確認しても2.7.3だった。

他サイトなどを参考にし、

`bundle install` や `rbenv local 2.7.3`

などを行っても解決しなかった。

エラー解決

GemfileやRubyのバージョンを変更した際に、gitにコミットしていないことが原因であった。

そこで

`git add .`

`git commit -m “”

元記事を表示

rails Bootsnapを無効化する

# 起きている問題
rails sすると
bootsnapでエラーが出る
`gems/bootsnap-1.3.2/lib/bootsnap/load_path_cache/core_ext/kernel_require`

# エラー原因のBootsnapを無効化する

以下の二つの行を無効化
“`ruby:Gemfile
# gem ‘bootsnap’, ‘>= 1.4.4’, require: false
“`

“`ruby:boot.rb
# require “bootsnap/setup” # Speed up boot time by caching expensive operations.
“`

その後

“`
$ bundle install
“`
を実行

以上で解決
“`
$ rails s
“`

元記事を表示

特定の条件下で attribute のデフォルト値が書き変わってしまう問題と、その対策として Rails/AttributeDefaultBlockValue を少し紹介

ActiveRecord や ActiveModel::Attributes の attribute メソッドによって属性を定義する際に、第二引数の cast_type を指定せず、かつデフォルト値を指定している場合に、この属性に対して破壊的な変更をするとデフォルト値が書き変わってしまう。

以下はデフォルト値に空の配列を指定した場合の例。

“`rb
class C
include ActiveModel::Attributes

attribute :hoge, default: []
end

c = C.new
c.hoge << 😡 c = C.new c.hoge #=> [:x] # [] が期待値のはず
“`

この挙動によるバグを引き起こしやすい `attribute :hoge, default: []` や `attribute :hoge, default: {}` のような記述が、アプリケーションコードに入らないようにするための Cop が `Rails/AttributeDefaultBlockValue` である。

https://do

元記事を表示

Railsでcheckboxとvalidationを使っただけなのに

## 結論

– `form.check_box`はfalse値を送信できない。
– Ruby on Railsでmodelの真偽値(true/false)のvalidationを書くときは、`presence: true`ではなく`inclusion: [true, false]`を使わないといけない。

## 経緯

[Rails をはじめよう](https://railsguides.jp/getting_started.html)に沿ってrailsを触ってみていました。ただ、そのままやるのはおもしろくないなと思ったため、ガイドでは記事(`Article`)を表示するウェブページを作成したところを、少しだけアレンジして`Todo`を表示するものとして作成していました。`Todo`は`Article`のもつ値に加えて`hasDone`という完了済みか否かを表す値を持ちます。

`hasDone`は`Todo`を作成するときに、View側からは

“`erb

<%= form.label :hasDone %>
<%= form.check_

元記事を表示

[Rails][Ruby] update_allとwhereを使用するときに気をつけること

## はじめに
未経験からエンジニアに転職して、2ヶ月ほど経つエンジニアです。
業務にあたりながらも、小規模なアプリを作って楽しんでいます。
今回は大量のレコードをまとめて更新するときに重宝する update_all についてです。

## 結論
update_all を使用するときはクエリの実行タイミングに注意しよう。

## update_all とは
>条件に一致するレコードをSQLを直接実行して全て更新
updated_atとupdated_onは更新されない

バリデーションやトランザクションを無視する点も注意が必要です。

https://railsdoc.com/page/model_update_all

## クエリキャッシュのタイミングに注意
~~~ruby
def update_user_data
#このタイミングではクエリは走らない
users = User.where(id: XXX, status: XXX, …)

#上記 where と組み合わせて UPDATE users … FROM … WHERE … が走る
users.

元記事を表示

【Rails】投稿記事の公開/非公開機能 Boolean

投稿記事に公開・非公開機能をラジオボタンで実装したので記録を残します!
間違っている箇所があればご指摘頂けると大変助かります(_ _).。o○

##### 前提
・Deviseログイン機能実装済
・Postテーブルにboolean型でカラム追加(今回のカラム名:is_published_flag)

#### Postモデルに条件式を定義

“`
/app/controllers/posts_controller.rb

class Post < ApplicationRecord belongs_to :user # 公開・非公開機能 scope :published, -> {where(is_published_flag: true)}
scope :unpublished, -> {where(is_published_flag: false)}
~省略~
end
“`
scope :スコープの名前, -> { 条件式 }
公開・非公開を見分けられるように条件式を書きます。

#### Postsコントローラー

“`
/app/contro

元記事を表示

AWS Fargateからherokuに移行した話

## はじめに
※ 自分用メモ
awsの無料期間がそろそろ切れそうなので、バックエンドをherokuに移行したお話

## 移行前
#### バックエンド
言語・フレームワーク: Ruby、 Ruby on Rails
インフラ: AWS ECS(Fargate)、ECR、Route53(ドメイン取得はお名前.com)、RDS(Mysql)無料枠があるから、Auroraではない、ALB、ACM、S3、EFS

#### フロントエンド
言語・フレームワーク: React、NextJs
インフラ: バックエンドと同じ

#### ミドルウェア
webサーバー: Nginx
DB: mysql

## 移行後
#### バックエンド
言語・フレームワーク: Ruby、 Ruby on Rails
ミドルウェア: Nginx、mysql
インフラ: heroku、jawsdb、S3

#### フロントエンド
言語・フレームワーク: React、NextJs
インフラ: vercel、Route53(ドメイン取得はお名前.com)、ACM

### バックエンド移行(aws ⇨ hero

元記事を表示

【Rails7】Rails7 Hotwire × TailwindCSS SPA風ポートフォリオor個人開発アプリの下地を作ろう!(環境構築・投稿機能作成まで)

## はじめに
未経験からエンジニアに転職して、2ヶ月ほど経つエンジニアです。
業務にあたりながらも、小規模なアプリを作って楽しんでいます。
その中で、RailsにHotwireを使用して作成したアプリが、
+ 未経験からエンジニアに転職するためのポートフォリオ
+ 個人開発のアプリ

に向いているのではないかなと思いました。

## なぜポートフォリオ or 個人開発に向いているか
**エンジニア歴2ヶ月の弱弱エンジニアの意見なので、あくまで参考程度に考えていただきたいです。**

**結論**
**フロントエンドのコードをほとんど書かなくても、SPA(シングルページアプリケーション)風のサービスを比較的簡単に作成できるからです。**

比較的というのは、VueやReactなどのフロントエンドのフレームワークを使用するより、という意味合いです。

自分自身、エンジニアに転職する時に完全SPAのポートフォリオを作成しました。
転職活動の際には、
**未経験でここまで作りきることができるのはすごい**
というような評価をもらうことが多くありました。(あくまで未経験にしては、ということで

元記事を表示

Ruby on Rails テスト環境を本番環境にしてみた

# 記事の背景
Ruby on Rails本番環境で再現していたバグをテスト環境で確認する為、テスト環境を本番環境に変更してバグ修正を試みようと思ったが、テスト環境を本番環境にするのにかなり詰まった為、記事を書いてみました。

## まず、環境を変えるとはどういうことか??
テスト環境では環境変数testで実行していたものをproductionに変える(**RAILS_ENV=test**を**RAILS_ENV=production**に変える)

## 詰まったこと
1. テスト環境で**RAILS_ENV=production**が実行出来ない。
2. コンソールが使用が出来ない。
3. テスト環境のデータベースが反映されない。
4. アセットプリコンパイルしてもcssや画像が反映されない。

# 各事象と解決方法
## ①テスト環境で**RAILS_ENV=production**が実行出来ないの解決方法
### 事象
下記コマンドを打つと、
“`
$ bundle exec rails assets:precompile RAILS_ENV=production
“`

元記事を表示

TECH CAMP12日目 ~ルーティングのネスト~

# ルーティングのネスト
– ルーティングのネストとは、段階に分けてルーティングを記述すること

__書き方の例__
“`ruby
Rails.application.routes.draw do
resources :tweets do
resources :comments, only: [:create]
end
end
“`

## メリット
– ルーティングの記述をネストさせるとURLの階層構造ができる。
上記のようにルーティングした場合のURL
`/tweets/id(数字)/comments`
このようにどのツイートに対してのコメントなのかが一目でわかる。

– パラメーターに親要素のカラムを入れることができる
ちょっと分かりにくいので使わなかったらどうなるか↓

### 使わなかったら…
例)
“`ruby
Rails.application.routes.draw do
resources :tweets
resources :comments
end
“`
“`html.erb
<%= form_with 'hoge', co

元記事を表示

Gitでプロジェクトを管理するDay3

今日はアプリ開発でタスクをまとめました。具体的には、gitでissueを作成し、今後の開発を管理していきます。issueで利用できるチェックボックについて紹介します。

# gitでチェックボックスを作成するには?
チェックボックスとは↓のようなもの。チェックをつけたり外したりできます。
![スクリーンショット 2022-06-17 21.29.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/01cefcb1-62e7-fcbe-2aba-6837d301bc08.png)
記述の仕方
“`
– [ ] ここに文章ーー
– [x] 作成時にチェックをすでに入れていたい場合はこのように記述
“`

以上でチェックボックスを作成できます。ちなみにQiita上でも
– [ ] 同様の記述でチェックボックスを作成できます。 
– [x] チェック済みボックスを作成。

以上

元記事を表示

Rails チャット機能

## はじめに
[前回、Railsアプリケーションにマッチング機能を実装しました。](https://qiita.com/gobtktk/items/5caf074209faf31cae4a)今回は、マッチング成立後のユーザー同士のチャット機能を実装していきたいと思います。

### 実装環境
Rails7.0.2
Ruby3.1.0

## メッセージ機能の仕様
ユーザー同士が、「お気に入り!」評価をしている場合(マッチング成立時)に限り、チャットができるようにします。
ユーザーは複数のチャットに参加することができます。またチャットは、2人でするものとします。

## 実装の流れ
1. マッチング成立ユーザーページの実装(viewとcontroller)
1. チャットルーム用のテーブル(chat_rooms)を作成。
1. 中間テーブル(chat_room_users)を作成
1. ルーティングの作成
1. コントローラーの作成

## マッチング成立後、ユーザーページの実装(viewとcontroller)
### 1.ルーティングの設定
~~~ruby:routes.rb
R

元記事を表示

Rails マッチング機能の実装

## はじめに
Rails でアプリケーションを作成した際に、学んだことの復習と、知識の整理のために投稿します。
### 開発環境
rails: 7.0.2
ruby: 3.0.1

## マッチング機能の仕様
ユーザーは、自分以外のユーザーであれば、何人でもlikeとdislikeすることができますし、逆もまた然りです。

## ER図
テーブルと関係性をわかりやすくするため、ER図を作成します。

スクリーンショット 2022-04-18 16.39.28.png

### likesテーブルのカラムについて
– from_user : 誰からの評価なのかを判別するためのカラム
– to_user : 誰に対しての評価なのかを判別するためのカラム
– status : 評価結果(like or dislike

元記事を表示

リプライ機能を実装するには?Day2

オリジナルアプリ開発Day2、2本目の記事です。自分のメモのために書いています。

# RDB構造でリプライ機能実装する方法は?
Twitterやyoutubeのコメント欄のように、コメントに対して、コメントをする機能をreplyと言いますが、その機能をどのようなRDB設計で再現すればいいのか考えていました。

自分が考えたものも含めて、解決策は5つ。

## 先人たちが見つけてくれた解法
・隣接リストモデル(ナイーブツリー).
・経路列挙モデル
・閉包テーブルモデル
・入れ子集合モデル

よく纏められたサイトがあったのでそちらをご紹介します。

https://www.wantedly.com/companies/tutorial/post_articles/299434

https://www.slideshare.net/kamekoopa/ss-27728799

自分ならば、上記4つの解法の中から1つ選ぶとしたら、閉包テーブルモデルを採用すると思います。

## 自分が考えた解法
コメントテーブルに対して、コメントのIDを外部キーとしたリプライテーブルを作成します。これで、

元記事を表示

TECH CAMP11日目 ~中間テーブル~

# 中間テーブルとは
・多対多の関係性があるテーブルの間に設置するテーブル
・接続する2テーブルの外部キーをもつ

分かりやすい記事↓
https://qiita.com/ramuneru/items/db43589551dd0c00fef9

## 注意
テーブル間にアソシエーションを書く時、
例)usersテーブル、tagsテーブル、tweetsテーブルがある時、

Userモデルには
`has_many :user_tweets`
`has_many :tweets, through: :user-tweets`
の順番でかく。
`has_many through`で経由するテーブルとのアソシエーションを先に記載しないとエラーになる。

元記事を表示

DBってどんな種類があるの?Day2

# 今日の問題
オリジナルアプリ開発のday2です。今日は要件定義の作成、DB設計をやっていました。Twitterのようなフォロー機能を作る時どのようなDB設計を作ればいいのかわからず、DB設計について調べました。今回はDBについてまとめます。

# DBは3種類ある
テックキャンプではRDB(リレーショナルデータベース)についてしか学びませんでしたが、DBは主に3種類あるそうです。

### 1、階層型データベース
1つの頂点(親)が存在し、その下に複数の子供、孫が結び付けられている構造です。常に親とこの関係は「親1人対子1人」か「親1人対子多」の関係しか持てません。
![絵-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2707093/98e7b1ef-7995-1f23-b12d-6981cc154667.jpeg)
#### メリット
・「各ノード(親や子、孫などを示している丸1つ1つのこと)へのルートが決まっているので、処理速度が早くなる」というもの。
#### デメリット
・データの追

元記事を表示

OTHERカテゴリの最新記事