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

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

【Rails】RspecのFormオブジェクトモデル単体テストコードのエラー

# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 前提
Formオブジェクトクラスを作成して、モデル単体のテストコードの実装を行なっていました。具体的のスクールの課題でメルカリのコピーアプリのようなものを作成していた中で、今回のテストコードの実装がありました。

# 概要
商品購入機能を実装し、購入するにあたって、
「クレジットカード情報」
カード情報、有効期限、セキュリティコード
「配送先情報」
“`create_addresses.rb
class CreateAddresses < ActiveRecord::Migration[6.0] def change create_table :addresses do |t| t.string :post_code, null:fals

元記事を表示

【RUBY】if,elseを用いたプログラム

# はじめに
rails初学者の者です。オンラインでプログラミングを学習させて頂いてるのですが、さらに理解を深めていきたいと思い、学習したことを備忘録として、残して理解を深めていきたいと思います。
また、間違った点など、ありましたら、ご指摘いただけると幸いです。よろしくお願いします。

# 指定された2つの真偽値によって処理が異なるプログラムを実装していきます。
平日と休日によって、「その日が遅くまで寝ていられるかどうか」を判断する、sleep_inメソッドとして、真偽値によって処理が異なることを実装します。

# 第一引数の値では「平日かどうか」、第二引数の値では「休暇かどうか」をtrueまたはfalseを用いて以下のように表します。
第一引数がtrue(平日である)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がfalse(平日でない)または、第二引数がtrue(休暇である)の場合はtrueと出力。
第一引数がtrue(平日である)または、第二引数がfalse(休暇でない)の場合はfalseと出力。
第一引数がfalse(平日でない)または、第二引数がf

元記事を表示

【Rails】バリデーションのカスタムコンテキストon:を複数同時に指定したい場合の方法と仕組み

Railsでは、`on:`を使うことで、バリデーション実行タイミングを指定できたり、カスタムコンテキストとして実行するかしないかを調整できます。

https://railsguides.jp/active_record_validations.html#on

`on:`で定義したカスタムコンテキストを`valid?`等の引数に渡すことでバリデーションのチェックができます。
Railsガイドでは`valid?(:xxx)`の使い方が載っていますが、一度にカスタムコンテキストを複数指定する方法を書いておきたいと思います。

## 結論

結論としては、配列で指定してあげれば良いです。

“`ruby:controller
def create
book.valid?([:xxx, :yyy])

end
“`

“`ruby:book.rb
with_options on: :xxx do
validates :title, presence: true
…略
end

with_options on: :yyy do
validates :cont

元記事を表示

Rails 【where】日付・時間を範囲指定する際の注意点

## 行いたいこと
– where句を使用し、モデルのdeadline_onカラムから期日が近いデータを取り出したい。

## 完成形のコード
“`
model.where(deadline_on: Date.today..Time.now.end_of_day + (2.days))
“`

## 元々書いていたコード
“`
model.where(deadline_on: Time.now.end_of_day + (2.days)..Date.today)
“`
## 沼ったポイント
– 上記の元々書いていたコードでirb上でSQL文を確認していた際、BETWEEN節があったため問題ないと考えていた。
– 実際には、完成形のコードのように日時が早いものを先に後のものを後ろに記載しないと○日~○日までというような範囲指定はされないので注意が必要。

元記事を表示

Bsic認証

# ユーザー認証を導入

## 開発環境で環境変数を設定
※macOSがCatalina以降の場合

たとえば

「xxxx」というユーザー名と
「0000」というパスワードにて、設定をする場合。

##### ①ターミナルで以下を実行する
“`Terminal:ターミナル
vim ~/.zshrc
“`
すると、「~」が縦に大量に表示される。

##### ②「i」を押下し「インサートモード」にする
「– INSERT –」と最下部に表示される。

##### ③zshの内部に、以下の記述を追加
“`Terminal:ターミナル
export BASIC_AUTH_USER=’xxxx’
export BASIC_AUTH_PASSWORD=’0000′
~
~
~
~
— INSERT —
“`

##### ④インサートモードを終了
「escキー」→ 「:wq」→「Enterキー」を押して終了。

##### ⑤sourceコマンドを実行
“`Terminal:ターミナル
source ~/.bash_profile
“`

#

元記事を表示

【AWS】AMI作成後、502 Bad Gatewayエラーが発生する場合の対処方法

# 概要
ALBの振り分け先WEBサーバを複数用意するため、
– 既存のEC2インスタンスのAMIを作成
– 新規インスタンス起動時に上記で作成したAMIを利用
– ALBのターゲットグループに新しく作成したインスタンスを追加

した上でアクセスすると、
> 502 Bad Gateway

のエラーが発生し、アクセスできない状態となった。

# 環境
– アプリ
– ruby 3.0.2
– rails 6.1.4
– mysql 8.0.31

– EC2AMI
– Amazon Linux2 AMI
– app server : Unicorn
– web server : Nginx

# 原因
– AMI作成時、作成元のEC2インスタンスは再起動される
– サーバの再起動により、Nginxが停止したことで、そもそもアプリが起動しておらず、接続できなくなっていた

> 参考

https://docs.aws.amazon.com/ja_jp/toolkit-for-visual-studio/latest/user-guide/tkv-

元記事を表示

GoogleスプレッドシートAPIでforbidden: The caller does not have permission (Google::Apis::ClientError)が出た時の対処法

# どうした?

[こちらの記事](https://qiita.com/kazama1209/items/a08fe0d25384b4a6ea99)を参考に自作のスプシAPIに対してActive Jobを実行したところ、以下のようなエラー文が返ってきました。

“`
forbidden: The caller does not have permission (Google::Apis::ClientError)
“`

# 解決方法
エラー文を意訳すると「スプシへのアクセス権が無いよ」とのことなので、スプシの共有設定を変更してあげます。
スプレッドシートの右上にある`共有`ボタンを押し、下図の赤枠の箇所を設定します。

![スクリーンショット 2022-11-10 15.49.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2688241/b364975f-3d34-42a2-19ea-2579027f2426.png)

これにてAPIがスプシにアクセスし、ジョブを実行することができます。

元記事を表示

【Ruby on Rails】デプロイ手順

#### Gemを追加

“`Ruby:Gemfile
group :production do
gem ‘pg’
end
“`
“`Terminal:ターミナル
bundle install
“`

#### デプロイ用の設定ファイルを追加
① binフォルダに、render-build.shという名称でファイルを新規作成する。
② 作成したファイルに、以下の記述を追加する。
“`Ruby:bin/render-build.sh
#!/usr/bin/env bash
# exit on error
set -o errexit

bundle install
bundle exec rake assets:precompile
bundle exec rake assets:clean
bundle exec rake db:migrate
“`
#### database.ymlの設定を変更
このように変更することで、開発環境およびテスト環境ではMySQLが、本番環境ではPostgreSQLが使用されるようになる。
“`Ruby:config/databa

元記事を表示

プログラミング言語のバージョンアップ運用を検討してみた

## 背景

担当プロジェクトで使用している「Ruby」のバージョンがサポート終了(EOL)となることを受けて、バージョンアップのやっていき方を検討してみたため、記録としてメモを残します。

当初は、「バージョンアップをしなかった場合に起こりえるセキュリティリスク」を全て洗い出して検討しようとしていたが、それはあまりにも壮大な話であったため、リスク対応と対応する工数のバランスについてを検討した。

## 今回の結論

EOLになるからと言ってバージョンアップをするのではなく、CVE(脆弱性情報)として公表されたものの中で対応が必要な場合に対応することとした。

(参考)[cve.mitre.org](https://cve.mitre.org/)

そのような脆弱性情報のほとんどは大きなニュースとして回ってくることが多く、かつ社内の担当部署から情報収集・展開がなされる運用も出来ているため、このような結論に至った。

## 理由

理想でいうと、マイナーバージョンの安定版が出るたびに小まめにバージョンアップをしていくのがセキュリティ面から言うと理想的ではあるが、工数がかかるため、開発

元記事を表示

log_tagsでRails.loggerにsessionのuser_idを出力する

## 環境

* Rails 7.0.4
* redis 6.2

## cookie_storeの場合

“`rb
# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, …

# config/environments/development.rb
Rails.application.configure do

config.log_tags = [
:request_id,
lambda { |req|
session_key = (Rails.application.config.session_options || {})[:key]
session = req.cookie_jar.encrypted[session_key] || {}

“user_id: #{session[‘user_id’] || ‘-‘}”
}
]
end
“`

## redis_stor

元記事を表示

Bullet Trainを始めよう?️

## Bullet Trainとは
[Bullet Train](https://github.com/bullet-train-co/bullet_train)とはRuby on Rails上で動くSaaSのフレームワークです([Jumpstart](https://jumpstartrails.com/)みたいなもの)。
つまり、Railsを拡張しているものなので、新規アプリを作った時点で以下の機能がもうすでについています。
1. Deviseを使ってのユーザー登録・認証
2. Sidekiq & Redisのバックエンド・ジョブの設定
3. Jbuilderを使ってのAPI自動生成
4. Webhookの自動生成

他にも機能がたくさんありますし、Pro版を買ったらStripeの決済処理の設定など、色んな便利なツールが使えます。
[公式サイト](https://bullettrain.co/)
Bullet Trainの作成者:[Andrew Culver氏](https://twitter.com/andrewculver)
[Discord](https://discord.

元記事を表示

管理者と顧客を分けてDeviseを導入

## 初めに
今回は管理者と顧客を分けてDeviseを導入していきたいと思います。
※実装前提としてDeviseを導入していること

## 管理者と顧客のモデル設定

管理者側がAdmin
“`
管理者用
$ rails g devise Admin
“`
今回顧客側がCustomer
“`
顧客用
$ rails g devise Customer
“`
これをそれぞれターミナルに打ち込みます。

## 次にcontrollerを管理者、顧客で作成
“`
管理者用
$ rails g devise:controllers admin
“`
“`
顧客用
$ rails g devise:controllers public
“`
これらをそれぞれ記述するとappのcontrollerの部分がadminとpublicそれぞれ作成され2つに分かれてくれます。

## viewページの方も作成

“`
管理者用
$ rails g devise:views admins
“`
“`
顧客用
$ rails g devise:views publics
“`
これ

元記事を表示

【RSpec】validate_uniqueness_ofでテストが落ちるときの対処

## 環境
Rails 6.1.3.1
ruby 2.7.1
mysql Ver 8.0.26

##

“`shoulda-matchers“`というGemを使ってテストを書くとき、下記のエラーでテストが通らない。

“`ruby
it { is_expected.to validate_uniqueness_of(:number) }
“`

“`
Expected Employee to validate that :number is unique, but this could not
be proved.
After taking the given Employee, whose :number is ‹0›, and saving it
as the existing record, then making a new Employee and setting its
:number to ‹0› as well, the matcher expected the new Employee to be
invalid, but it was valid in

元記事を表示

配列になっているJSONの値を複数レコードとして保存する

railsでJSONファイルで値を受け取る際、その値が配列になっていたとします。これをいい感じにdbに保存する方法を模索しました。
## 結論
each文で回すしかなくない?
私の技術力不足、ググり力不足かもしれないけどeach文で回して値整理してって感じしか思いつかない。

## 私の実装方法
想定しているJSON
“`json
{
“proposed_days”: [
“2022-11-14T18:15:45.087+09:00”,
“2022-11-14T18:16:45.087+09:00”,
“2022-11-14T18:52:09.671+09:00”
]
}
“`
controllerでの処理
“`ruby
proposed_days_params.each do |proposed_at|
render json: event.errors unless possible_dates.create(proposed_at:)
end

private
def proposed_days_params
params.require

元記事を表示

Rails 7.0.4のScaffoldで生成されるファイルのサンプル

Railsアプリの開発をしていると、Scaffoldで生成されるファイルではどうなっていたかなと思うことがあるので、参照できるようにしました。

“`bash
% rails new app –css=bootstrap
% rails g scaffold Content title:string body:text
“`

# Model

“`ruby:app/models/content.rb
class Content < ApplicationRecord end ``` # Controller ```ruby:app/controlers/contents_controller.rb class ContentsController < ApplicationController before_action :set_content, only: %i[ show edit update destroy ] # GET /contents or /contents.json def index @contents = Content.a

元記事を表示

【個人開発】動物好き必見!動物とのふれあいに特化した検索サービス『FLUFF MAPS』を作りました!

![top3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2253662/4ed74182-39f9-020b-a1bd-0959e9631f03.jpeg)

この度「動物とふれあうことができる施設を簡単に検索できるサービス【FLUFF MAPS】」をリリースしました!

__サービスURL__
https://www.fluff-maps.com

__GitHub__
https://github.com/kazuki1025okumura/fluff_navi

## はじめに
はじめまして![おくむら](https://twitter.com/kazuki_okumura)と申します。
私自身、動物が大好きでよく牧場や動物園にふれあいにいきます。

ネットでそういった施設を探していて、「条件を絞り込んで検索できたらな」だったり「ふれあうことができる動物が一覧で見れたらな」と感じていて、それなら自分で作ってしまおう!と思い製作しました。

## このアプリへの思い

元記事を表示

フレームグラフを読むのは簡単ではありません

フレームグラフを読むのは簡単ではありません。練習が必要です。ですが、ちょっとしたコツもあります。ここではそれを紹介します。

フレームグラフやウォーターフォールチャートを呼ばれる種類の可視化を見ないで1日を過ごすことは、ほとんどありません。大抵はSpeedscopeやChrome DevToolsで、そういった可視化を目にしています。

著書の多くやワークショップの中でフレームグラフの読み方を教えていると、そこでつまづく人を見かけます。フレームグラフを読んで理解するのは、ある程度はスキルの話です。スキルを身につけるには、絶え間ない練習が必要です。

ただ、フレームグラフを読むスキルはサブスキルに分解できます。その場合に最も重要だと私が考えるのは、「どのフレームが重要で意味があるのかを判断できる」スキルです。

プロセスは、Xミリ秒ごとに停止します。停止されると、プロセスの現在のスタックが記録されます。例えば、フレームAはフレームBを呼び、フレームBはフレームCを呼び出すといった具合です。念のために言っておくと、実行スタックとは、例外のバックトレースを見るときなどに表示されているもののこ

元記事を表示

正規表現とmatch,subメソッド

# はじめに
正規表現を用いた任意の文字列のチェック方法やその他できることをまとめる。

## matchとsubメソッドについて
### subメソッド
subメソッドは、文字列の指定した部分を別の文字列に置き換えるためのメソッドです。
第1引数に置き換えたい文字列を指定し、第2引数に変換後の文字列を指定します。また、操作したい文字列は/で囲みます。

【例】
irb(main):001:0> str = “りんごを食べる”
=> “りんごを食べる”

irb(main):002:0> str.sub(/りんご/,”みかん”)
=> “みかんを食べる”
「りんごを食べる」という文字列が「みかんを食べる」という文字列に置換されました。

### matchマッチ
matchメソッドは、引数に指定した文字列がメソッドを使用した文字列に含まれているか否かをチェックするためのメソッドです。含まれている場合は、指定した文字列がMatchDataというオブジェクトが戻り値で得られます。また、含まれていない場合は、戻り値としてnilが得られま

元記事を表示

バリデーションの記法と正規表現

# はじめに
バリデーションに用いる正規表現をまとめる。

## 正規表現
| パターン | 意味 |
| —- | —- |
| [a-z] | 角括弧で囲まれた文字のいずれか 1個にマッチ |
| \d | 数字にマッチ |
| {n, m} | 直前の文字が少なくともn回、多くてもm回出現するものにマッチ |
| {n} | 直前の文字がn回出現するものにマッチ |
| . | 改行以外のどの1文字にもマッチ |
| + | 直前の文字の1回以上の繰り返しにマッチ |
| \A | 直後の文字が先頭にある文字列にマッチ |
| \z | 直前の文字が末尾にある文字列にマッチ |
| [ぁ-んァ-ヶ一-龥々] | 角括弧に囲まれたかな、カナ、漢字のいずれかにマッチ(ヴ、ヵ、ヶ、々を含む) |
| ?= | 直後に設定した文字が続く文字列にマッチ |
| *? | 直前に設定した文字が0回以上続く文字列をチェックし、?の直後の文字が出た段階でその1文字を返す |
| \ | エスケープ文字と

元記事を表示

railsでJSONファイルの値を分割して受け取る

railsでひとつのJSONで二つのテーブル分のデータを受け取った際の処理を書く際に手間取ったのでメモ。
## 受け取るJSONファイル
“`json:event.json
{
“category_id”: 1,
“name”: “TestEvent”,
“is_public”: true,
“description”: “テストイベントです”,
“proposed_at”: [
“2022-11-14T18:15:45.087+09:00”,
“2022-11-14T19:16:45.087+09:00”,
“2022-11-14T18:52:09.671+09:00”
]
}
“`
イベントの名前だったりそのイベントの候補日のデータ

## コントローラー側の処理
“`ruby:event_controller.rb
def event_params
params.require(:event).permit(
:category_id,
:name,
:is_public,
:des

元記事を表示

OTHERカテゴリの最新記事