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

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

gem VCRでweb mockを使う

[gem vcr](https://github.com/vcr/vcr)を使ってpush通知のテストを効率化した話を書きます。

VCRとはテストで使う『HTTP通信』を1回目に記録しておいて、2回目以降のテストでの実行はその記録を使って行うことができます。
Webmockと組み合わせて使うと非常に効率的にテストができるようになりました。

## VCR
VCRの使い方の概要。

– テストコード内で実行するリクエストに、外部のwebAPIなどに対してHTTPリクエストを送る箇所があれば、そこにVCRを使う旨をまず設定する
– VCRでは設定した後にHTTPリクエストを送ると、設定ファイル(ymlファイル)に、HTTPリクエストとそれに対応するレスポンスの組合せを自動で記録し、モックを作成する。

VCRを有効にしてテストコードを実行すると、VCRは具体的には以下の動きになる。

1. テスト実行中に送信されるHTTPリクエストを監視
1. HTTPリクエストの送信を見つけると、設定ファイル内のHTTPメソッドとURIが一致する、HTTPリクエストを探索
1. HTTPリクエストが見

元記事を表示

実際に使用される第3正規形のデータってどんなの?

# 初めに
基本情報技術者試験の勉強をしていた時に、個人的に納得できなかったものが第3正規形の問題です。試験問題の解法自体は理解するものの、用意されたデータがあからさますぎで実際の設計時はどうなるのだろうと疑問に思っていました。具体的に第3正規形におけるデータとはどのようなものでしょうか?

# 正規化のおさらい
> 第1正規形
> ・繰り返し項目を持たない
> ・導出項目を持たない
> 第2正規形
> ・第1正規形を満たしている
> ・主キーに対してすべての非キー属性が完全関数従属
> 第3正規形
> ・第2正規形を満たしている
> ・すべての非キー属性がどの候補キーに対しても推移的に関数従属していない

https://oss-db.jp/dojo/dojo_info_04

LPI-Japan OSS-DBのサイトに載っている正規化の説明から一部流用します。

# 第3正規形の問題でよくあるもの
個人的に納得できなかった問題のサンプルがこれです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.

元記事を表示

【Rails】Twitterクローンを作ってみた 〜ログイン周り編〜

## はじめに
現在、railsを用いてtwitterのクローンを作成しております。今回はログインまわりについて私が書いたコードをもとに、アウトプットしていきます。※こちらはdockerでの環境構築を省きます。
## サービス環境
– ruby 3.0.0
– Rails 6.0.4
– docker
– mysql 8.0.2
– Slim, SCSS

## ログインとサインアップ
#### 条件
– ログイン・サインアップ・トップページの作成
– ユーザーモデルの作成
– ログイン画面・サインアップ画面の作成
– ログイン中はトップページに自分の名前とつぶやきボタンが出る。(ボタンはまだ動作しなくて良いです。)
– ログアウトができること
– トップページはタイムライン以外の部分を作成してください。
– Deviseを使用しユーザーを作成してください。そしてログイン・ログアウト・サインアップができるようにしてください。
#### 実装流れ(簡略)
① gem(bootstrap, slim, devise等)の追加、bundle install
② deviseをインストールし、

元記事を表示

Rails7でtailwindCSSをインストールする方法

まだアプリケーションを作成していない場合は、下記コマンドでtailwindが使えるようになります。
“`
rails new myapp –css tailwind
“`

既にアプリケーションがある場合、下記二つのコマンドを実行すればインストールされます。
(参考にしたサイト→ [tailwindcss-rails](https://github.com/rails/tailwindcss-rails/blob/main/README.md “”))

“`
./bin/bundle add tailwindcss-rails
./bin/rails tailwindcss:install
“`

元記事を表示

MVC(Model View Controller)とは?

## はじめに
Ruby on Rails 等で使用される MVCについて書きたいと思います。

## MVCとは?
– Model View Controller の略称
– プログラムの処理を役割毎に分けて開発を行う考え方
– Webシステムの開発で主に使用される
– 以下のフレームワークで使用されている
– Ruby on Rails, Laravel, SpringBoot 等

## MVCの構成
– Model
– ビジネスロジックを書く部分
– データベースとのデータのやり取りを行う部分
– View
– ユーザーが実際に見る画面
– Controller
– リクエストやレスポンスを制御
– ViewとModelの橋渡し

## 図

![MVC.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636476/0d506bc0-9156-ad22-c09e-11278e413164.png)

## 参考

元記事を表示

【Docker】Rails 6系 x Docker x MySQL 8で環境構築してみた

## 条件
– docker-compose upでrails serverを起動できるようにすること
– ホストのファイルシステムとコンテナのファイルシステムを同期させること
## 1. 各種ファイル作成
任意のディレクトリファイル配下に以下のファイルを作成します。
“`
$ mkdir docker-files
$ cd docker-files
“`
– Dockerfile
– docker-compose.yml
– Gemfile
– Gemfile.lock

それぞれのファイルの中身を書いていきます。
### Dockerfile
“`dockerfile
FROM ruby:2.6
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add – && \
echo “deb https://dl.yarnpkg.com/debian/ stable main” | tee /etc/apt/sources.list.d/yarn.list && \
apt-get upd

元記事を表示

deviseでの`downcase’ for nil:NilClassエラー

## 背景
Rails6でdeviseでサインアップAPI作成中に遭遇
取り急ぎ解決したのでメモ書き程度に記載。

## エラー内容

“`
$ curl -X POST http://localhost:3015/api/v1/auth -d ‘[name]=test2&[email]=test2@example.com&[password]=password&[password_confirmation]=password’
{“status”:500,”error”:”Internal Server Error”,”exception”:”#\u003cNoMethodError: undefined method `downcase’ for nil:NilClass\u003e”,”traces”:{“Application Trace”:[],”Framework Trace”:[{“exception_object_id”:15280,”id”:0,”trace”:”rack (2.2.4) lib/rack/utils.rb:464:in `[]='”},{“e

元記事を表示

fields_forを使用して新規登録時に別レコードも作成する

# はじめに
railsを利用してポートフォリオを制作しました。制作するにあたって、会員登録時に別モデル内にレコードを作成したいと思いました。
その機能を実装したいと思った理由は、ゲームの成績を管理するスコアシートを制作したかったからです。
会員登録と同時にプレイヤー名としても勝手に登録してくれることで、スコアシートを作成する際に参加しているプレイヤーとして自身の名前が選べるようにする為です。
実装するにあたりfields_forを使用しました。伝わりづらいかもしれませんが自分なりにまとめてみようと思います。

# やり方
会員登録に関してはdeviseを使用しました。
こちらが新規登録を行うページです。
“`erb:registrations/new.html.erb

新規登録画面

<%= form_with model: @user, url: user_registration_path do |f| %>

<%= f.label :name, "会員名" %>
<%= f.text_field :name, autofocus:

元記事を表示

重複のバリデーションエラーを回避するFactoryBotの書き方

# 目的
Userモデルにてemailの一意性をバリデーションとして設定している場合、下記のテストコードではエラーが発生する。
“`ruby
FactoryBot.define do
factory :user do
user_name { “tester” }
email { “tester@example.com” }
password { “password” }
end
end
“`
“`ruby
it “複数のユーザー登録” do
user1 = FactoryBot.create(:user)
user2 = FactoryBot.create(:user)
end
“`
エラーが発生しないように複数のテストユーザーを作成する。
# 実装方法
“`ruby
FactoryBot.define do
factory :user do
user_name { “tester” }
#シーケンスを利用する
sequence(:email) { |n| “tester#{n}@example.co

元記事を表示

エラー対応:Migration Nameにて「NO FILE」

# エラー内容
modelを実装中、DBに不手際を確認。
該当ファイルを削除した結果、Migration Nameにて「NO FILE」のエラーを確認。
「rails db:rollback」を実施していないため、エラーが発生。
# 修正対応
– migrationの状態を確認
“`ruby
rails db:migrate:status
“`
– 下記のmigrationを確認
“`ruby
Status Migration ID Migration Name
————————————————–
up 20210726110200 Sorcery core
up 20210726111347 Add columns to users
up 20210804115220 Create boards
up 20210804120214 Add user id to boards
up 20210811081624 Add img

元記事を表示

gretelを使ってパンくずリストを作成

# 目的
scaffoldアプリにてgretelを使ってパンくずリストを作成する。
最低限の内容を学習するため表示させるのはuser_newとuser_showのみにします。
# 新規の技術・機能の概要
## gretelの概要 ##
パンくずリストを作成するgem
![edit_パンくず](https://storage.googleapis.com/zenn-user-upload/bfc1d2ce13dae18ea22395b7.png)
webサイトの上部などにあるサイトページの位置等を示すリストがパンくずリストです。
gretelの設定ファイルは下記の通り
“`ruby
crumb “ページ名” do
link “ビューに表示される名前”, “リンクされるURL”
parent :親のページ名(現在の前のページ)
end
“`
表示させるコードは下記
“`ruby
<%= breadcrumbs separator: "区切り文字" %>
“`
## 執筆時のバージョン ##
Rails:5.2.6
gretel:4.3.0
# 実装方法
## 新規アプリを作

元記事を表示

Rake + Wheneverでブログのステータスを自動的に変更するアプリを作成

# 目的
シンプルなブログアプリに記事のステータスをcronタスクにて自動的に変更する機能を実装する。
# 新規の技術・機能の概要
**Rake**
Rubyで記述されたビルドツール
**Whenever**
railsにてcronタスクを簡単に設定するgem
**執筆時の対象Version**
Rails:5.2.6
Whenever:1.0.0
# 実装方法
## セットアップ ##
“`terminal:terminal
# アプリの新規作成
rails new blog_sample
cd blog_sample
“`
“`terminal:terminal
# scaffoldにてBlogモデルを生成
rails g scaffold Blog title:string content:text
“`
“`diff ruby:db/migrate/*******_create_blogs.rb
class CreateBlogs < ActiveRecord::Migration[5.2] def change create_table :blogs d

元記事を表示

pundit でシンプルな認可機能アプリを作成

# 目的
PunditはRailsにおいて認可システムに必要なヘルパーなどを提供するgemです。
punditよりシンプルな認可機能アプリを作成します
> **Qiita:Pundit + Railsで認可の仕組みをシンプルに作るより引用**
> Punditというgemを使ってRailsに認可の仕組みを作ってみます。
> 認可というとcancancanが有名です。
> cancancanはユーザに対して、どんなアクションが許可するかを定義するのに対して、
> Punditではリソースに対して誰が許可されるのかを定義します。反対からの目線ですね。
> cancancanがコントローラ寄りならば、Punditはモデル寄りの責務です。また、
> cancancanがDSLなのに対し、PunditはピュアRubyな書き方になっています。

**学習アプリに実装する機能**
管理ユーザーのみユーザー詳細(user_show)閲覧可能。
管理ユーザー以外の場合はエラーページを表示(403)。

**執筆時の対象Version**
Rails:5.2.6
devise:4.8
pundit:2.

元記事を表示

[Rails][shebang] bin/rails : No such file or directory 解決法

# 問題

VM上のCentOS 環境からgit cloneした
Rails projectの `bin/rails` `bin/rake` などbinstabコマンドがうまく実行できない。

“`
$ bin/rails console
: No such file or directory
“`

->
bin/rails ファイル中身を 削って、見ると
そもそも1行もruby実行できていない

# 原因

shebang とよばれる1行目 の読み込みが悪いよう

一方で `rails c`
など 当のbinstab を使用しないと実行はできる:

“`
$ rails c
/home/vagrant/.rbenv/versions/2.7.6/bin/ruby: warning: shebang line ending with \r may cause problems
..
“`
( ->
改行コードが 悪いみたいなwarning が出ている..

## 解決法

全体的に改行コードが問題っぽいが、

とりあえず、
当binstab を以下でencod

元記事を表示

【未経験】ポートフォリオ開発記録 #01

# はじめに
はじめまして!
自分はweb系の自社開発企業への転職を目指しています。
これから転職活動を進めていくにあたってポートフォリオの開発をしていきます。
その際に、機能実装の流れや詰まったことなどを備忘録的な感じで記録していこうと思っています。

今回は、現在考えているサービスの簡単な概要と、使用技術についてまとめられたらと思います!

# サービス概要
早速ですがサービスの概要です。

現在アイデアとして考えているサービスは、音楽再生機能付きのポモドーロタイマーです。
開発しようと思った背景としては、自分はプログラミングの勉強にポモドーロタイマーを活用しているんですが、自分の好きな音楽とポモドーロタイマーを合わせようとすると、どうしても複数の操作が必要なってしまって地味に面倒でした。
この問題は僕の身の回りにも多いようでした。
これからwebエンジニアとしてやっていくなら勉強はずっとしていくと思いますので、ポートフォリオだけで終わらず長く使えるようなサービスにできればと思い考案しました。

イメージとしてはこんな感じです。

![キャプチャ.PNG](https://qii

元記事を表示

【個人開発】野球観戦をもっと楽しめるサービス、「野球バカ実況」をリリースします!

## まえがき
私は未経験のエンジニアで約一年間Railsを中心に勉強していました。野球観戦を楽しめるサービスを開発してみました。野球が好きな人は読んでくれれば嬉しいです。後半には難しかった技術についても述べています。技術が好きだという人も是非読んでいただければ嬉しいです!

# サービスURL
#### サービス名:「野球バカ実況」
###### 以下サービスURL
https://yakyubaka-jikkyo.com/

###### 以下Git Hub

https://github.com/GreatMuta514/baseball_app
## サービス概要
野球の試合を見ながらリアルタイムでチャットができます。
野球の試合の勝敗予想ができます。
野球ファンに試合観戦をより楽しんでもらえるサービスです!

**今日から日本シリーズが始まります!野球ファンの方は是非、試合を見ながら使ってみてください!**
## 使い方
### 試合前
試合前には、どんな試合になるかみんなで予想しましょう!
– 試合予想を投稿。
– みんなの予想をチェック。
– コメントで議論。
[![I

元記事を表示

長いコマンドをまとめることができるMakefileが便利

例えば、初めてRailsサーバーを起動するのに以下のコマンドが必要だとします。

“`bash
$ docker-compose run web yarn install –check-files
$ docker-compose run web rails db:create
$ docker-compose run web rails db:migrate
“`

これらを入力するのは面倒です。そこでMakefileが役立ちます。

Makefileはタスク名、コマンドで最低限OKです。コマンドの前にはTabを入れます。

“`makefile:Makefile
タスク名:
コマンド
“`

先程のRailsのコマンドを入れるとこのようになります。

“`makefile:Makefile
setup-rails:
docker-compose run web yarn install –check-files && \
docker-compose run web rails db:create && \
docker-compose run web

元記事を表示

adminのパスワードを忘れた話。

はじめに

今回は投稿サイト作成にあたって、gemのdeviseを使って
user側とadmin側を分けて作成しております。
ん?devise?user側とadmin側分けるってなに?って方は以下サイトをご参照あれ。
>https://nllllll.com/ruby-on-rails/rails-devise/
>https://www.sejuku.net/blog/13378

deviseを導入することで、簡単に認証機能を実装することができます。
つまりサインアップやサインインの実装が簡単にできてしまう便利なgemです!

今回user側からの実装を進めていき、ある程度終わりが見えたところで
「さ、admin側に行くか」と思ったんですが。。

admin側のログイン画面にいき、ふと立ち止まりました。
「あれ?一度サインアップしてる??したかな。いやでもしたかも」
おそらく作成時にちゃんとサインアップできるかテストしていたんだと予測。
しかしそのパスワードもなにもかも覚えていない。

adminのパスワードを再設定しよう

方法

ぼっち演算子(&.)

# ぼっち演算子とは
&.(Safe Navigation Operator)は、通称ぼっち演算子と呼ばれており
ぼっち演算子は、オブジェクトに対してとあるメソッドを呼び出した時、そのオブジェクトがnilでない場合は、実行結果を返します。一方で、nilの場合は、nilを返してくれます。
“`ruby:ぼっち演算子を使って、テキストの情報を取得する
# 変数@itemに情報が定義されている場合
[1] pry(main)> @item&.text
=> “アイテム”

# 変数@itemがnilの場合
[2] pry(main)> @item&.text
=> nil
“`

通常のオブジェクトメソッドという書き方では、オブジェクトがnilの場合はundefined methodのエラーになってしまいます。
ですがぼっち演算子を使う事によりif文を使わず簡潔化する事が出来ます
“`ruby:例
# if文を使用した場合
@item.tags.first.tag_name if @item.tags.first.present?
# ぼっち演算子を使用した場合
@item.tags&

[Chart.js]折れ線グラフの縦軸を反対にする方法

# はじめに
今回ポートフォリを制作するにあたってChart.jsを使用し折れ線グラフを表示させました。
その中で折れ線グラフの縦軸を反対にしました。
あまり需要がないのか、実際に記事にされているものが無かったため公式を調べ実装を行いました。
この知識が誰かの役に立てば幸いと思い記事を書かせてもらいます。

# 今回記述するグラフについて
### 修正前
“`js:line_graph.html.erb
document.addEventListener(‘turbolinks:load’, function() {
var ctx = document.getElementById(‘line_graph’);
var myChart = new Chart(ctx, {
type: ‘line’,
data: {
labels: [‘1回前’, ‘2回前’, ‘3回前’, ‘4回前’, ‘5回前’, ‘6回前’, ‘7回前’, ‘8回前’, ‘9回前’, ’10回前’],
datasets: [{