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

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

TimeWithZoneクラスについて

## 環境
Ruby2.6
Rails5.2

## はじめに
Railsでシステム日付を取得する場合は、Ruby標準のTimeメソッド、Dateメソッドは使わずに、Railsで用意されている、TimeWithZoneクラスを使うことになります。

TimeWithZoneクラスはActive Supportの拡張メソッドです。Ruby標準のTimeメソッド、Dateメソッドを使ってシステム日付を取得すると、OSが持っている日付がそのまま取得されるのに対し、TimeWithZoneクラスを使うと、OSのシステム日付がどうであれ、config/application.rbで設定しているタイムゾーンに該当する日付に変換して取得してくれます。

例えば、OSのタイムゾーンがUTC(協定世界時)である場合、Ruby標準のメソッドを使うと、UTCの日付がそのまま取得されます。しかし、TimeWithZoneクラスを利用すると、OSのタイムゾーンがUTCであっても、Railsで下記の設定をしている場合、JST(日本標準時間)に変換して取得してくれます。
“`config/application.

元記事を表示

rubyzipを用いて、一時退避させたファイルをzipに圧縮し送信する

# やりたいこと
rubyxlで編集したエクセルファイルを数十個出力し、それらをzipファイルで圧縮しsend_dataで送信したい。

# 使用するgem
https://github.com/rubyzip/rubyzip

Gemfileに以下を記入し、bundle installを実行します。
“`
# zipファイル作成
gem ‘rubyzip’

“`

# 使用例
複数箇所で使用したかったので、moduleにしました。
“`
# zipファイルを作成

require ‘rubygems’
require ‘zip’
# windows文字化け対策
require ‘nkf’

module CompressFilesToZipService
module_function

def call(filenames, folder, zipfile_name)
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
filenames.each do |filename|

元記事を表示

エンティティの洗い出し

 最近フリマアプリを実装するにあたってエンティティの洗い出しとER図、readmeを書くのにめっちゃ時間かかったので復習。
 結論からいうとER図はこんな感じになった。
![スクリーンショット 2022-10-26 9.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/3c3285f3-f061-b9a2-ee60-6c9bba870c92.png)

 フリマアプリのER図を書く時に一番困ったのは、中間テーブルの存在。
自分の浅い認識では中間テーブルというのは多対多のテーブルの関係の間にはさまってるイメージだったけど、今回は出品情報を一旦まとめるテーブルと、受け取り先をまとめるテーブルを作って、その間を取り持つような形になった。
 ユーザー情報はdeviseをつかって。あとでバリデーションとか設けるときにメールアドレスとパスワードはdeviseの使用で勝手に記述されるので、二重記述にならないように注意。
 で、テーブルの設計はこうなった。
![スクリーンショット 2022-10

元記事を表示

ログインユーザーのみコメント/投稿ができる機能を実装

前提条件

ログインしたユーザーのみがコメント/投稿できるように制限をかけてみたいと思います。

♦︎投稿機能、コメント機能、ユーザー機能が実装済みである
♦︎Gem ‘devise’を導入している
上記を前提条件として記述していきます!

ポイントは”user_signed_in?”メソッド

user_signed_in?メソッドとはなんぞや。まあ読んだままのメソッドで、
ユーザーがサインインしているかどうか判定してくれます。
ヘルパーメソッドの一種ですが、こちらは前提条件で示しているように、
deviseを導入していることで使えます。
※もしuserではなくて、customerやmemberを使用している場合は
それぞれの仕様に書き換えてください。

コントローラーを書き換える

“`ruby:app/controllers/comments_controller.rb
def create
if user_signed_in? ①
post = Post.find(params[:post_id])

元記事を表示

【完全SPA】独学・未経験者が「防災啓発」アプリを開発した話(1/2)【Rails/Nuxt.js/AWS/Docker/CircleCI/Terraform】

## 記事の内容

業界未経験がWeb系エンジニアになるべく作成したポートフォリオに関して、以下の情報を2つの記事に分けてまとめます。

1. ポートフォリオの紹介
2. 利用してもらった感想 と フィードバックによる改善
3. 技術選定理由 と 使用した教材の紹介
4. 反省 と 今後の課題

長くなりそうなので、まず本記事では、 1 と 2 について記事を書かせていただきました。
3 と 4については、[こちら](#)に書く予定です。
最後まで読んでいただけると嬉しいです!

## ポートフォリオ「Bosai Lv」紹介
![logo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2263192/4a61eea6-b0c4-e256-4a80-df1bc31a25ea.jpeg)

## 概要

Bosai Lvは、**防災に関するタスクを達成することで、防災レベルが上がる**アプリケーションです。
以下の課題を解決できます。

– 「災害に備えなければいけない」のは分かるけど、具体的に何をすればよ

元記事を表示

Rubyでクラシカルなアルペジオを作ってみた (Mac環境)

## これは何?
元ミュージシャンの私が、今現場で使っているRubyでなんとか作曲っぽいことができないか試みた記事です。
OSは、Montereyを使用しており、特に有料ツールなども使用しておりません。

## 用語の説明

– アルペジオ
– 和音を構成する音を一音ずつ順番に弾いていくことで、リズム感や深みを演出する演奏方法。
– MIDI (MIDIデータ)
– 音楽の演奏情報をデータ化し、電子楽器やパソコンで再生できるようにしたものです。
– MIDI音源 (ソフトウェア音源)
– MIDIの情報に従って演奏をする機器

## 下準備編

### MacのMIDI出力を準備する

1. Launchpad から MIDI で検索し、`Audio MIDI設定` を開きます。

2.

元記事を表示

aggregate_failuresを使ってRspecのシステムテストを高速化した

Rspecのシステムテストで実行時間が30分以上かかるテストがありました。example数は約100件です。
何とかならないものかと考えた結果、`aggregate_failures`を導入することにしました。これによりテスト実行時間を約10分まで短縮することができました。

# aggregate_failuresとは?

it内であるexpectが失敗した時に、次のitに移行せず、it内の全てのexpectを実行してくれるメソッドです。通常であれば1つのexpectが失敗した時点で次のitに移行してしまいます。`aggregate_failures`は全てのexpectを実行して、失敗したexpectが複数件あればそれらの情報を全て出力してくれます。

# どんなテストだったか?

こんなテストでした。

beforeを使っていて、itごとにFactoryBotでuserをbuild→ログイン処理をしています。

“`ruby
describe ‘XXX’, type: :system, js: true do

before(:each) { @user = FactoryB

元記事を表示

ActiveSupport::Concernとは

## ActiveSupport::Concernとは
Modelやcontrollerで重複した処理をActiveSupport::Concernを使用することでよりDRYに記述できる機能

## 使用するには
1. `app/models/concerns/`or`app/controllers/concerns/`にファイルを作成
– ファイル名はmoduleと同じにする
2. `included do end` の中に処理を書く
– スコープだけでなく、メソッドを定義したりもできます
– `extend ActiveSupport::Concern`を忘れないように
3. 使用したいmodelファイルの中でincludedする
4. concernに追加したメソッドを使用する際はそのまま呼び出せます

#### 例
“`ruby:app/models/concerns/m.rb
module M
extend ActiveSupport::Concern

included do
scope :disabled, -> { where(

元記事を表示

【Rails】POST送信でCSVファイルをダウンロード

# やりたいこと
### CSVファイルダウンロード機能をPOST送信で実現したい。

CSVファイルはブラウザから取り出すことができるので、ブラウザのHTMLからアクションを起こし、ブラウザにCSVデータを返却する方法が良さそう。また、セキュリティ的な観点で、CSVファイル生成に必要なデータは、サーバー側(controller側)でDBから引くようにします。

**方法**
①`xxx.csvファイル`をgetアクセスで読み込んでダウンロード(CSV形式での返却ファイル指定する必要あり。)
  ↑はググってよく見る方法
②HTMLの`form`からPOST送信のレスポンスをブラウザで受けとって、ダウンロード

既存のコードに追加する際に、最も綺麗に実装できそうな②をチョイスしました。

# 全体の大まかな流れ
・CSVファイルを生成するための条件を`form`で送信
・`controller`側で受け取った条件をもとに、必要なデータを用意する
・CSVファイルを用意し、書込みを行う
・書込みが完了したCSVファイルをブラウザ側に返却する

# 実装内容
**view側**
`f

元記事を表示

mimemagicインストール時のエラー

# 前提
“`
$ ruby -v
ruby 2.6.6p146 (2020-03-31 revision 67876) [x86_64-darwin21]
$ uname -m
x86_64
“`

# 起きたエラー
“`
An error occurred while installing mimemagic (0.3.10), and Bundler cannot continue.
“`

## エラー詳細
“`
$ bundle install
Fetching gem metadata from https://rubygems.org/……….
Using rake 13.0.6
Using minitest 5.16.3
Using thread_safe 0.3.6
<略>
Fetching sassc-rails 2.1.2
Installing mimemagic 0.3.10 with native extensions
Installing sassc-rails 2.1.2
Fetching sass-rails 6.0.0
Inst

元記事を表示

楽天GORA  API導入について(Ruby)

# 概要
楽天GORAのAPIを用いた アプリを作成した時に起こったことを残しておく記事になります。
あまりGORAに関する記事がなかったためもし間違いに気がついてご指摘いただける様でしたら
なおありがたいです。
記述はrailsで作成したものになります。

# 要件
楽天GORAのAPIを導入する

# 手順一覧
## 1. まずは楽天に登録して、APIを利用するためのIDを発行してもらう
https://webservice.rakuten.co.jp/

これに登録して専用のIDを発行してもらい、それを用いてAPIとの通信を許諾してもらいます。

## 2. 発行してもらったIDを環境設定に配置する

config > initializer > rakuten.rb
[rakuten.rb]は既存ファイルではないので、自分で作成する(名称は何でも可)

・rakuten.rb
“`ruby
RakutenWebService.configure do |c|
# (必須) アプリケーションID
c.application_id = ‘発行してもらったID’

#

元記事を表示

DockerでRails環境(Nginx+Unicorn+MySQL)を構築してFargateへデプロイするまで〜本番環境編〜

# 概要
今回は前回の続きで、ECS Fargateへとデプロイを行う本番環境編となっています。

前回の記事:
[DockerでRails環境(Nginx+Unicorn+MySQL)を構築してFargateへデプロイするまで〜開発環境編〜](https://qiita.com/GuChiM1292/items/b7c54ae1b0f831060a70)

# 設定手順
[1. VPC周りの構築](#1-vpc周りの構築)
[2. RDSの構築](#2-rdsの構築)
[3. ECRリポジトリの構築](#3-ecrリポジトリの構築)
[4. ECSの構築](#4-ecsの構築)
[5. アプリのデプロイ](#5-アプリのデプロイ)

## 1. VPC周りの構築
### VPC
|key|value|
|—|—|
|名前|three-mouth-vpc|
|IPv4 CIDR|10.0.0.0/16|

![vpc作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2131579/ab03ea

元記事を表示

【Rails】永続ログイン時に作成されるremember_tokenの有無をminitestで調べる方法

# どうした?
Railsチュートリアルにならって永続ログイン機能を実装しました。
永続ログイン時にはUserモデル内で定義されたクラスに`remember_token`というインスタンス変数が付与されます。
本記事は、minitestでそれの有無を調べる方法をメモとして残します。

# テスト方法
## うまくいかない方法(ログイン時)
“`ruby:users_login_test.rb
assert !@user.remember_digest.nil?
“`
`@user`に`remember_token`をハッシュ化した`remember_digest`が付与されているかどうかを調べれば良いのかなと思いましたが、minitestはこれをfalseで返してきます。

minitestは、モデル内で定義したインスタンス変数にテストの内部からアクセスできません。
これは、インスタンス変数とminitestのスコープが異なるためです。

## cookiesに`remember_token`が存在するかをチェックする方法
cookiesに保存された`remember_token`

元記事を表示

タグ検索機能 select(プルダウン)で実装してみた

タグ検索機能をプルダウンで実装したいとの声があったので
実装してみました!
タグ機能自体の実装に関しては、以下の記事を参考に進めていますので
DB周りの実装は以下の記事を参考にしていただけると幸いです?

https://qiita.com/MandoNarin/items/5a5610a40c66f77d6c10

# 目次
本記事は以下の流れで進みます!
1. [form_tagの実装](#formtagでの見た目実装)
1. [検索機能の実装](#検索機能の実装)

# form_tagでの見た目実装
## タグ機能を1つ実装した場合の検索機能
“`erb:posts/index.html.erb
<%= form_tag({controller:"posts",action:"index"}, method: :get) do %>
<%= select_tag :tag_search, options_from_collection_for_select(@tag, "id","name") %>
<%= submit_tag "検索する"

元記事を表示

【Rails】redirect_toを使うとき、flash.nowは表示されないよという話

# どうした?
Sessionsコントローラでログイン機能を実装したところ、`flash.now`が表示されなかった。
minitestのログインテストでは
“`ruby
assert !flash.empty?
“`
は`true`を返していた。

## 開発環境
“`terminal
$ ruby -v
=> ruby 3.1.2p20

$ rails -v
=> Rails 6.1.7
“`

# 解決方法

**before**
“`ruby:sessions_controller.rb
def create
@user = User.find_by(email: params[:session][:email])
if @user && @user.authenticate(params[:session][:password])
log_in(@user)
remember(@user)
flash.now[:info] = “ログインしました”
redirect_to root_path
else
flash

元記事を表示

Hotwireを使って正規表現チェッカーを作ろう

[@z_ohnami](https://twitter.com/z_ohnami)です。こんにちは。
railsの7から導入されたHotwireを使って、JavaScriptをできる限り書かずに正規表現チェッカーを作ってみました。

正規表現チェッカーといえば、[Rublar](https://rubular.com/)というサイトが以前から存在していて私は日頃からお世話になっていたのですが、見た目はそちらを参考にして作りました。

名前は「RegExpress」にしました。
[https://tools.bigwave.biz/regular_expressions](https://tools.bigwave.biz/regular_expressions?utm_source=qiita)
![ogp_image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10138/2e00e299-d7b5-c4c4-108c-07d87ff33583.png)
以下のように、正規表現のパターンとテスト用の

元記事を表示

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
“`

元記事を表示

OTHERカテゴリの最新記事