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

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

趣味アプリのテレビ放映まで1週間で行った負荷対策まとめ

## 背景
– Heroku の Hobby Plan で運用していたサービスがテレビの取材を受け、[ひるおび](https://www.tbs.co.jp/hiru-obi/)で放送された
– 放送1週間前に「サイトが落ちないように何か対策できないか」と相談され、そこから調べたり準備したりしたことについて書く

## 事前調査
### テレビ放映時のアクセス数を見積もり
下記のブログを読み、1分間に450アクセス程度という見積もりで始めました。

– [テレビ放送に向けての負荷対策(AWS x Rails の場合)[前編]
](http://techblog.housmart.co.jp/2016/03/03/prepare_for_wbs/)
– [テレビ放送に向けての負荷対策(AWS x Rails の場合)[後編]
](http://techblog.housmart.co.jp/2016/03/10/prepare_for_wbs2/)

### 現在の構成のスペックについて
元々の構成は下記の通りでした。

– アプリケーションサーバー: Rails アプリケ

元記事を表示

【RSpec】Railsチュートリアル 第3章~第5章

#はじめに
Railsチュートリアル第6版ではテストフレームワークとして**Minitest**が採用されているが、実際に現場で使われることの多い**RSpec**を用いて、第3章から第14章において作成するsample_appのテストを書いていく。
テストする内容自体は基本的にはチュートリアルの内容に沿って進めていく。
また、RSpecの書き方については、[『Everyday Rails – RSpecによるRailsテスト入門』](https://leanpub.com/everydayrailsrspec-jp)という書籍を参考にしている。

#事前準備
Gemfileにrspecとcapybaraを追加

“`rb:Gemfile
group :development, :test do
gem ‘rspec-rails’
end

group :test do
gem ‘capybara’
end
“`

RSpecをインストール

“`
$ bin/rails generate rspec:install
“`

ジェネレーターの設定を変更

“`conf

元記事を表示

【クレジットカード不要】無料の最強構成でWebアプリを作ってデプロイする【Vercel + Heroku + MongoDB Atlas】

2021年10月時点でクレジットカード不要で利用できるサービスの中で最適だと思う組み合わせで、Webアプリ開発の環境構築からデプロイまで行います。

# 利用するホスティングサービス

## Vercel

– ReactのフレームワークNext.jsで作ったアプリをデプロイできる。
– 日本のCDNを利用できるのでNetlifyに比べて応答が早いらしい。
– 無料のHobbyプランは個人利用で非営利目的のみ(広告はOKらしい)。

## Heroku

– 今回はRuby on Railsで作ったアプリをデプロイしてAPIとして利用する。
– アプリを稼働できるのは1つのアカウントにつき550時間/月。
– PostgreSQLのアドオンはレコード数10000行の制限がある。

## MongoDB Atlas

– 無料プランでは容量512MBまで利用できる。

# 開発環境

OS: Windows 10 20H2

WindowsではRuby on Railsの動作が安定しないので、WSL2という機能を使ってWindows上でLinuxを動かして開発します。

## 開発環境

元記事を表示

【Rails】validateはカスタムメソッド

よく使用する“`validates“`とめちゃくちゃ似てるカスタムメソッド
モデルの状態を確認し、無効な場合にerrorsコレクションにメッセージを追加するメソッドを作成できる

“`model.rb
class Invoice < ApplicationRecord validate :expiration_date_cannot_be_in_the_past private def expiration_date_cannot_be_in_the_past if expiration_date.present? && expiration_date < Date.today errors.add(:expiration_date, ": 過去の日付は使えません") end end ... end ``` ###RSpecでテストする際 expiration_date_cannot_be_in_the_pastメソッドがprivateだった場合、 モデルの単体テストではなく、リクエストテストで期待するエラーが返るかのテストを

元記事を表示

【RSpec】shoulda-matchersを使ってテストを1行で書く

##環境
Ruby 3.0.2
Rails 6.1.4.1
shoulda-matchers 5.0.0

shoulda-matchersを使えばバリデーションテストが1行で書けるので大変便利

##enumのテスト

“`model.rb
enum weather: { sunny: 0, cloudy: 1, rainy: 2 }
“`

– define_enum_for

“`spec.rb
describe ‘enum’ do
it { is_expected.to define_enum_for(:weather).with_values(
sunny: 0,
cloudy: 1,
rainy: 2
) }
end
“`

##バリデーションテスト

“`model.rb
validates :firstname, presence: true
validates :lastname, presence: true
validates :number, presence: true, uniqueness: t

元記事を表示

Rails7に標準装備されるライブラリのカタカナ読み一覧

## イントロダクション
開発現場とか、クライアント面談とかで何て発声したら良いか迷ったので、共有。
随時更新するかもしれません。

## 一覧

import maps(インポート マップス)

Hotwire(ホットワイヤー)

Stimulus(スティミュラス)

元記事を表示

RailsにRedisを接続するシンプルなやり方

イントロダクション

他の記事が初心者のためにわかりやすくし過ぎていたり、自分が理解した部分だけ書いていて分かりにくかったため記述した。

前提

Redisインストール済みであること(Macならbrewでインストールする

参照: https://qiita.com/sawa-@github/items/1f303626bdc219ea8fa1

Redis接続方法

Railsの新規プロジェクト作成

Gemfileに「gem redis-rails【Rails初心者】Chart.jsの使い方

グラフ(折れ線グラフ、棒グラフ、レーダチャートなど)を書くのに優れているrubyライブラリを学習しましたので、記録のために残します。

#公式ドキュメント
[Chart.js公式サイト](http://www.chartjs.org)

#使い方

##① rails newしてアプリ作成

“`
% rails new chart
“`

まず学習用のファイルを作成します。

## ② controllerとroutesの設定

コントローラーを作成します。

“`
% rails g controller home
“`

続いてコントローラーにindexメソッドを作成します。

“`ruby:app/controllers/home_controller.rb
class HomeController < ApplicationController def index # 追記 end end ``` コントローラーの記述が終わったらルーティングを作成します。 ```ruby:app/confing/routes.rb Rails.application.ro

元記事を表示

【Rails】Herokuでのお問い合わせフォームの作成方法

## お問い合わせフォームの実装

利用環境
・ruby 2.7.3
・Rails 6.1.4

## 前提
お問い合わせフォームでメールを受信するためのメールアドレスを作成
ここではGmailを登録する前提で進めます。

## Gmailアカウントの設定
・2段階認証に設定する
・アプリで利用するためのパスワードを作成
 リンク先:https://myaccount.google.com/u/3/security

## ActionMailerの設定
本番環境のみでの設定とします。
開発環境でのメール確認に興味がある方はこちらを参考にしてみてください。
https://github.com/fgrehm/letter_opener_web

“`terminal:ターミナル
touch config/initializers/mail.rb
“`

“`ruby:config/initializers/mail.rb
if Rails.env.production?
# 自身のドメインに置き換えてください
host = “Herokuのサブドメイン.herokuap

元記事を表示

railsチュートリアル第10章 管理ユーザー

##ユーザーを削除する
###管理ユーザー
特権を持つ管理ユーザーを識別するために、論理値をとるadmin属性をUserモデルに追加

“`
ubuntu:~/environment/sample_app (updating-users) $ rails generate migration add_admin_to_users admin:boolean
Running via Spring preloader in process 3171
invoke active_record
create db/migrate/20211016122254_add_admin_to_users.rb
““

####boolean型のadmin属性をUserに追加するマイグレーション
db/migrate/[timestamp]_add_admin_to_users.rb

“`rb
class AddAdminToUsers < ActiveRecord::Migration[6.0] def change add_column :use

元記事を表示

railsチュートリアル第10章 パーシャルのリファクタリング

###パーシャルのリファクタリング
railsの便利なツールを使ってコードを整理する

####indexビューに対する最初のリファクタリング
app/views/users/index.html.erb

“`rb
<% provide(:title, 'All users') %>

All users

<%= will_paginate %>

    <% @users.each do |user| %>
    <%= render user %>
    <% end %>

<%= will_paginate %>
“`
####各ユーザーを表示するパーシャル
app/views/users/_user.html.erb

“`html

  • <%= gravatar_for user, size: 50 %>
    <%= link_to user.name, user %>
  • “`
    ####indexページの完全なリファクタリング
    app/views/users/index.html.

    元記事を表示

    【Rails×LIFF】 モテたい人向けのマッチングアプリ完全攻略サービス 「マッチングアプリマスター」 を作りました。 (男性向け) 【個人開発】

    # サービス概要
    ![マッチングアプリマスター トップページのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840723/5b55db01-0083-8a4f-1a8a-a2c37478f7c7.png)
    対応端末は`iPhone X 以降(スマホ)`を推奨しております。
    LIFFアプリ(LINEで動くWebアプリ)なのですが、外部ブラウザ(SafariやChrome)からも開くことが出来ます。
    ※ 二極化

    URL:https://dating-apps-master.com/top
    Github:https://github.com/ryuki7/dating-apps-master

    マッチングアプリを利用しているが女性と上手くいかない、女性の扱い方がわからない、女性との出会いが無くて困っている人に
    目的別に適したマッチングアプリを導き出し、そのアプリごとのテクニックやコツを全て指南して、モテ男(マッチングアプリマスター)への道標となる
    マッチングアプリ完全攻略サービスです。

    元記事を表示

    テーブルにないカラムにも値を入れて送信できる件

    #はじめに
    ECサイトを作ってみましたが、以下のイメージのように、お届け先をいくつかの選択肢の中からチェックボックスで選ぶような場面でどうすれば良いのか少し戸惑ったのでまとめておきます。

              ![スクリーンショット 2021-10-28 21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2214201/ef84a14b-06e5-f07f-b945-e66d192478ed.png)

    #分からなかったこと
     選択肢に値を持たせて、その値によってコントローラーで処理を分けるところまでは想像がついたのですが、今回で言うと、注文テーブルに選択肢(option)カラムはないのでどうすれば良いのか戸惑いました。
     とりあえず、`option = 0`なら「ご自身の住所」、`option = 1`なら「登録済みの住所から選択」として以下のように書いてみました。

    “`ruby:orders/new.html.erb
    <%= form_with model: @order, url: or

    元記事を表示

    【RSpecエラー】validate_uniqueness_ofを使うとテストが通らないとき

    ##環境
    Ruby 3.0.2
    Rails 6.1.4.1

    ##状況

    バリデーションのテスト実行時に下記のエラー
    デフォルトでは大文字と小文字を区別している

    “`model.rb
    validates :email, uniqueness: true
    “`

    “`spec.rb
    it { is_expected.to validate_uniqueness_of(:email) }
    “`

    “`
    Expected Employee to validate that :email is case-sensitively unique,
    but this could not be proved.
    After taking the given Employee, setting its :email to ‹”dummy
    value”›, and saving it as the existing record, then making a new
    Employee and setting its :ema

    元記事を表示

    RailsからGoogleスプレッドシート連携させる際に認証でつまづいた点(2021/10時点)

    # はじめに
    よくあるRailsアプリケーションからGoogleスプレッドシートに連携するのを実装したかったのだが盛大につまづいたのでポイントをメモ
    大まかな手順としては以下などを参考にしてください

    Google Sheets API を使ってスプレッドシートを操作


    https://techblog.hacomono.jp/entry/2020/10/21/095900

    ## OAuth 同意画面のアプリケーションの種類で「その他」が選択肢にない
    ![スクリーンショット 2021-10-28 18.08.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27192/2dfbedf8-6225-5466-ea10-c9451d341a0c.png)

    「その他」がないなら「ウェブアプリケーション」だろうなぁと思ってたら落とし穴。
    承認エラーになります
    ![スクリーンショット 2021-10-28 18.03.42.png](https://qii

    元記事を表示

    git push heroku masterをしたら、Precompiling assets failedが表示された時の対処法

    **結論**

    webpackerをインストールしていませんでした。

    **エラー文**

    “`ruby:ターミナル

    remote: ! Precompiling assets failed.

    #省略

    error: failed to push some refs to ~~~
    “`

    **解決までの流れ**

    赤字で書かれていた上の2つの文をそれぞれGoogleで調べましたが、自分にあった対処法が見つけられませんでした。
    色々と悩みましたが、ログを上から順に見ていくことにしました。
    そうすると、大事なことが書かれている部分を発見しました!

    “`ruby:ターミナル
    #省略
    remote: webpack binstubs not found.
    remote: Have you run rails webpacker:install ?
    “`

    「webpackないよ? rails webpacker:installした?」 と言われていました。

    なので、

    “`ruby:ターミナル
    rails webpacker:i

    元記事を表示

    【備忘録】git pushでのerror “src refspec main does not match any”

    rails学習中につき、よくやってしまうので備忘録として残しておきます。
    私と同じような初学者の方の参考になれば幸いです。

    “`
    % git push -u origin main
    “`

    を実行したときにこのようなエラーが出たら

    “`
    error: src refspec main does not match any
    error: failed to push some refs to ‘https://github.com/[githubアカウント名]/[githubリポジトリ名].git’
    “`

    mainをmasterに変えて

    “`
    % git push -u origin master
    “`

    を実行すればよい!

    元記事を表示

    [Rails]暗黙的レンダリングでハマった

    ## 概要
    開発環境とrspecで、APIレスポンスがなんか全然違う・・・開発環境だとステータスコード204なのに、rspecだと500どういうこと?
    ということがあったので調査したことまとめ。

    ## 前提
    参考: [ActionController::ImplicitRender](https://api.rubyonrails.org/classes/ActionController/ImplicitRender.html)

    以下のメソッドを使った明示的なレスポンスを返さないコントローラーのアクションメソッドに対して「暗黙的なレンダリング」がなされる。

    – render
    – respond_to
    – redirect
    – head

    ## 暗黙的なレンダリング
    ### パターン①
    https://railsguides.jp/api_app.html
    でapiのアプリケーションを構築した場合(= ApplicationControllerをActionController::API から継承している場合)は、

    204 No Content

    が返るらしい

    ### パターン

    元記事を表示

    【Ruby on Rails】よくあるエラー集

    # Routing Error
    まずはrailsの中でroutingがどのような役割をもっているか理解する必要があります。
    ・[Routingとは](https://railsguides.jp/routing.html)
    ![S__29761599.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2165607/6dbee024-2cdc-4f25-5c83-6078c4cdee79.jpeg)
    それではエラーについて解説します。
    **Routing Error**
    routes.rbで定義したルーティングに存在しないURLにアクセスされた場合に起きるエラーです。

    **原因**
    routes.rbに記述されているものが間違っている。

    **解決策**
    routes.rbに記載されているものが、コントローラー名とアクション名とマッチしているか確認する(スペルミスなどが考えられます)

    # Syntax Error
    **SyntaxError**
    コードの中にRubyの文法エラーがあるときに発生します。S

    元記事を表示

    【Rails】コントローラーの処理を共通化したい

    ##環境
    Ruby 3.0.2
    Rails 6.1.4.1

    ##共通化する前

    UsersControllerとHomeControllerともに同じコードがあるので共通化したい。

    “`posts_controller.rb
    class PostsController < ApplicationController def index @post = current_user.post end end ``` ```home_controller.rb class HomeController < ApplicationController def index @post = current_user.post end end ``` ##共通化した後 共通化したいコードをconcerns下にメソッドとして定義する。 ```concerns/common_action.rb module CommonAction extend ActiveSupport::Concern def set_posts @posts = c

    元記事を表示

    OTHERカテゴリの最新記事