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

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

コントローラ#アクションとHTTPメソッド・ルーティングヘルパーの対応表

コントローラ#アクションとHTTPメソッド・ルーティングヘルパーの対応表です。
コントローラスペックをリクエストスペックで置き換える際に使ってください。

| コントローラ#アクション | HTTPメソッド ルーティングヘルパー |
| :———————: | :——————————-: |
| articles#index | get articles_path |
| articles#new | get new_article_path |
| articles#create | post articles_path |
| articles#show | get article_path(:id) |
| articles#edit | get edit_article_path(:id)

元記事を表示

【Rails】いいね機能index追加(resourceからresoucesへの変更)

# はじめに
先日、いいね機能を実装した。↓

https://qiita.com/vaza__ta/items/c0bc7f590793ab5a4769

showテンプレートにいいねしたユーザー一覧を表示するようにしていたが、indexテンプレートを実装するよう変更する。

その際にroutes.rbでresource=>resourcesに変更した。
これにより、ルーティングの変更が発生するため、その修正すべき部分を解説していく。

# 前提
下記のテーブルは作成済み。
users(ユーザー)
posts(投稿)
favorites(いいね)
| No | 項目 | 内容 |
|—:|————-|————|
| 1 | OS | Mac |
| 2 | Ruby | 2.6.3 |
| 3 | rails | 6.0.4 |

# ルーティングを修正する
indexを追加するために、resouceをresourcesに変

元記事を表示

【ドメイン駆動設計】なぜ値オブジェクトそのものを比較できるようにしなければならないのか?

値オブジェクトは以下の3つの要素を持ったオブジェクトだとされている。

1)不変である(一度インスタンスが作られたら、それが保有する属性の値は変化してはいけない)
2)交換が可能である(再代入=交換によってのみ値を変更することができる)
**3)等価性によって比較される**

このうち、3)は絶対に必要なんだろうか?

例えば、Date型にかなり近い、YearMonth(年と月をもったオブジェクト)を定義してみよう。

“`ruby
class YearMonth
attr_reader :date

def initialize(year, month)
@date = Date.new(year, month, 1)
end

end
“`

一応値オブジェクトとして定義しているものの、「日付が1日のDate型オブジェクト」」としても外部から認識できる。なら、YearMonthそのものを比較できなくても、保有しているDate型(プリミティブ型)同士を比較すればいいんじゃないか?という疑問が生まれる。

実際にやってみよう。

“`ruby

year_mo

元記事を表示

【日付計算】Rubyで◯時間前、◯日前、◯ヶ月前、◯年前と計算するメソッド

業務で更新日(updated_at)と今日の差分を計算して○日前と返すapiを作成することがあったのですが、この仕様とマッチする記事がなかったのでQiitaに残しておきます!

以下の記事を参考にさせていただきました。
基本的なロジックやコードの解説はこちらの記事を参考にしてください。

[満経過月数を計算するロジック(Ruby)](https://qiita.com/tomoya_sakusaku/items/71801ad618394ca3cbc7 “満経過月数を計算するロジック(Ruby)”)

## 今回の仕様

**最終更新日から今日の差分を計算して○日前と返す**

『0~24時間前』 『1~30日前』 『1ヶ月~12ヶ月』 『1年~』の単位で区切る

例) Today:2022/07/30/10:00
Last_updated:2021/07/30/19:00
⇨『一年前』を返す

例)Today:2022/07/30/10:00
Last_updated:2022/06/30/19:00
⇨『一ヶ月前』を返す

例)Today:2022/07/30/19:00
Las

元記事を表示

Rails7でHelloWorld

## 前提
– Rails(前回の記事で手順を記載しています)

https://qiita.com/chiepon115/items/bc7bdab6105aa5836465

– DBに登録されたデータをControllerで取得し、Viewで表示するシンプルな内容になっています

## Controllerを作成

– `rails g controller users index`でUsersControllerを作成
– ApplicationControllerを継承しています

– `Hello, World`をブラウザに表示させます
– renderの行を追記します
“`ruby:app/controller/users_controller.rb
class UsersController <

元記事を表示

Cloud9でRails7の環境構築を行う

## 前提
– 学習用途のRailsプロジェクトを想定しています
– Rubyの環境構築を行なっていること(前回の記事で手順を記載しています)

https://qiita.com/chiepon115/items/eeea61818e0e8701f747

– Version
– Ruby 3.0.2
– Rails 7.0.0

## Railsプロジェクトの作成
### Railsのインストール
– `gem install rails -v 7.0.0 -N`でRails7.0.0をインストール

### Railsプロジェクトの作成
– `mkdir rails_projects`でRailsプロジェクト用フォルダを作成
– `rails _7.0.0_ new hello`でRailsプロジェクト作成
– Railsのバージョン7.0.0を指定してインストール
– `hello`という名前のプロジェクトで作成
GitHub を登録

まずはユーザー名(GitHubに登録したもの)を登録
“`
$ git config –global usr.name “ユーザー名”
“`

メールアドレス(GitHubに登録したもの)を登録
“`
$ git config –global user.email “メールアドレス”
“`

mergeの際にファストフォワードが起きないようにする設定
“`
$ git config –global merge.ff false
“`

pullの際に毎回リベースする設定
“`
$ git config –global pull.rebase merges
“`

設定ができているかを確認
“`
$ git config –list
“`


“`
credential.helper=osxkeychain
user.name=”name”
user.email=email
core.editor=code –wait
alias.ci=commit
alias.st=status
alias.br=branch
alias.co=checkout

元記事を表示

開発用(feature)ブランチにmain(master)ブランチをマージした時 初心者向け

作業用(開発)ブランチで作業をしていて、メインブランチの最新状態を反映したくなった。
メインブランチをmergeコマンドで作業用ブランチに反映すると以下のメッセージが表示された。

“`:ターミナル
Merge branch ‘main’ into feature/create_comment
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with ‘#’ will be ignored, and an empty message aborts
# the commit.
~

元記事を表示

Active Storageのしくみ

Ruby on Railsにて、Active Storageのインストール後に生成されるマイグレーションファイルの中身が気になったので、その仕組みを読み解いてみる。

### 〜Active Storage の導入コマンド〜
`$ rails active_storage:install`

`$ rails db:migrate`で、Active Storageが使えるようになる。

## マイグレーションファイルに定義される3つのテーブル
1. active_storage_blobsテーブル
1. active_storage_attachementsテーブル
1. active_storage_variant_recordsテーブル

### active_storage_blobsテーブル
– ActiveStorage::Blobモデルのテーブル
– 添付されたファイルに対応
– 識別key(`:key`)、ファイル名(`:filename`)、Content-Type(`:content_type`)、ファイルのメタデータ(`:metadata`)、サイズ(`:by

元記事を表示

プルダウンのフォームでプレースホルダーのようなものを実装する方法(Rails)

# はじめに

Railsでアプリを作成中、以下のようなフォームを実装したいときに、どのように実装するかが勉強になったので記載します。

– 未選択時
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/17b2e2fd-80f2-bea2-3bfc-b84f0275a532.png)
– プルダウンを表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/a049724b-45c2-1c93-9e25-8920c7961bd4.png)
– 選択後
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051539/5be5710e-ecf8-a9b4-d4f8-7ac0b09efdb2.png)

前提として、**selectタグでは、placeholder属性が効かない

元記事を表示

UAからGA4への移行(Config実装編) ~GA4の知識はClassにして自己文書化しよう~

## 駆け出しエンジニアがGA4を導入
始めまして、エンジニア歴1年が経過した駆け出しエンジニアです:runner:
今回、GoogleAnalyticsでUAからGA4の移行業務を担当しました。
ソースコードに直埋めする方法を簡単ですがGA4導入という形で記事にしたいと思います。
開発はRailsで行っているので一部の例はRubyで記載しています。
タグマネージャーやGA4画面等の説明は含みませんが、これからGA4を導入する方の参考になればいいなと思います。:writing_hand:

## GA4は新しいGoogleAnalytics
https://support.google.com/analytics/answer/10089681

これまでGoogleAnalyticsではUA(ユニバーサルアナリティクス)というプロパティでデータの収集を行っていました。
新しいGA4というプロパティが発表されていますが、

「GA4って何が違うの:interrobang:」
「イベントベースに変わって同じように測定できるの:question:」

などなど、様々な理由からGA4の導入を

元記事を表示

【Rails】chartkickのlinechart、Y軸を反転させるオプション

# はじめに
chartkickでline_chartを実装してランキング表示をしてましたが、知らんうちにY軸反転が効かなくなってました。
自分の環境ではchart.jsの仕様変更っぽかったので、メモしておきます。

# 環境
– Rails 5.2
– Ruby 2.7.6
– chartkick (4.2.0)

# 変更点

“`
library: { scales:{ yAxes: [{ ticks: { reverse: true, } }] } }
“`

で動いていたのが、2022年7月に動かなくなってましたが、

“`
library: { scales:{ y: { reverse: true} } }
“`

で動くようになりました。

……最初からこうしておいてくれよ!w

終わり

元記事を表示

【2022年】GA4のAPI(Analytics Data API)をRailsで使う方法

初記事です!
正直、苦労しすぎたので、同じ苦しみを味わう方が少しでも減ればという想いで書きます。よろしくお願いします!

# !注意!
– 利用したのは旧式のAnalyticsではなくGA4です。
– GA4はアップデートが激しいため、この通りにコードを書いても、数カ月後には動かない可能性があります。あくまでも現時点では、ということをご理解ください。

# 使うAPIとGem
– Analytics Data API
https://developers.google.com/analytics/devguides/reporting/data/v1
– google-apis-analyticsdata_v1beta
https://github.com/googleapis/google-api-ruby-client/blob/main/docs/usage-guide.md

【前提というか自戒】
公式ドキュメントやGemの中身はきちんと読みましょう。特にGem。公式ドキュメントは更新にラグがあり、今回はかなり苦しめられました。
もしこの方法が使えなくなっても、Gem読めばた

元記事を表示

ActiveRecordのコールバックをInteractor層を使ってリファクタリングする

### Interactor とは
Interactor はアプリケーションのそれ以上分割できない責務の動きを実現する
アプリケーションのビジネスロジックをカプセル化するために使われるオブジェクトです

### ActiveRecordのコールバック

Railsガイドでは下記のように説明されています

> コールバックとは、オブジェクトのライフサイクル期間における特定の瞬間に呼び出されるメソッドのことです。 コールバックを利用することで、Active Recordオブジェクトが作成/保存/更新/削除/検証/データベースからの読み込み、などのイベント発生時に常に実行されるコードを書くことができます。

[Active Record コールバック – Railsガイド](https://railsguides.jp/active_record_callbacks.html#%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E3%81%AE%E6%A6%82%E8%A6%81
)

便利な反面副作用が大きく controller

元記事を表示

2つの区間(Range)の重複を判定する方法

どうも、「病院なび」の開発チームメンバー甘利です。
今日は区間(Rangeクラス)の重なりの判定について説明します。

Rangeクラスを利用していると、それらが重なっているか?という判定をしたくなる時があります。
ActiveSupportを利用していれば .cover? メソッドを利用することができますが、
そうじゃない時はどうしたら良いでしょうか。

ふたつの閉区間を表すRangeオブジェクトの r1 と r2 があり、
r1, r2 の端をそれぞれ r1_s, r1_e、r2_s r2_e と表すとします。
さて、このふたつのRangeが重なっていることを判別するにはどうしたら良いでしょうか。

# 順当に考えてみる
ふたつのRangeの区間が重なっているとはどういうことかを書き出してみますと、
以下のいずれかが成り立つとき、とうことになります。
1. r1 の範囲に r2_s が含まれている
1. r1 の範囲に r2_e が含まれている
1. r2 の範囲に r1_s が含まれている
1. r2 の範囲に r1_e が含まれている

これをRubyのコードでそのまま書くと

元記事を表示

Webpackeコンパイルで詰んだこと

#備考
技術関連の詳細記載はないので悪しからず。

# なぜ起こったか
Herokuにデプロイしたのがきっかけです。
その際に依存関係解消のため、対象のバージョンを変更した。
デプロイに成功したが、ローカルでコンパイルできなくなった。
ローカルで関連するところ、モジュールなどインストールやアンインスール、アップデートした。

# 結論
本来、エラーを解決していくのが筋かと思いますが、さまざま調べ試して詰んだので、
アプリ構築を初めからやり直しました。遠回りかもしれませんが、
これも一つの方法かと思います。幸い、体系的まとまった教材を参考にしていたので、
再構築もし易かったです。
なにより、作り直したことで問題となっていたコンパイルが解消したのが良かったと思います。

元記事を表示

【Ruby on Rails】Rails consoleで特定のレコードのカラムの情報を更新する方法

## Rails console
“`
pry(main)> User.first.update_column(:name, “ごりら”)
“`
これは、Userテーブルの一番目のテーブルのnameカラムの内容を“ごりら“に変更したいとき

## SQL文
“`
SELECT `users`.* FROM `users` ORDER BY `users`.`id` ASC LIMIT 1
UPDATE `users` SET `users`.`name` = ‘ごりら’ WHERE `users`.`id` = 1
“`

こんな感じ。

元記事を表示

Aurora MySQLをサービス無停止でスケールアップ

# はじめに
医療系クラウドサービスを提供している会社で働いている2kaiです。

2022年7月に入ってから新型コロナウイルス感染爆発に伴い、患者及び医療スタッフの利用数が急増し、ピーク時間帯のデータベースCPU使用率がWriter、Reader共に監視の閾値を度々超えてくるという状態になりました。
と、思った次の日には100%に届くスパイクまで発生したために、急遽サービス無停止でスケールアップを実施しました。

現時点での月間アクセス数は1億リクエストを超えるくらいです(正確には感染爆発の前月の集計値になります)。
作業時間帯(22時頃)のアクセス数は850/min。

# システム概要
Ruby on Rails in awsで構成された、恐らく一般的なモノリスアプリケーションです。

– アプリケーションはWeb、Worker、Batchから構成
– Ruby on Railsで実装し、WriterとReaderに負荷分散するようにコーディング
– 各アプリケーションはElastic Beanstalkで管理
– データベースはAurora MySQLで、WriterとRead

元記事を表示

リーダブルRSpec(カスタムマッチャー+RSpec::ContextHelper編)

## 読みやすいRSpec書いていますか?


### 読みやすいRSpecって何?

「簡潔でテストケースを見てテスト内容が理解しやすいもの」と考えています
ここでのテストケースとは、it/exampleブロックのことを指しています


## 例題
例えば、Rails製REST APIのRequest Specを書くことを考えてみます
コードは正しいか確認していないので、多少間違っていてもお許しください?

### 前提
* APIはたくさんある
* 良くないけど、クエリパラメータのチェックをcontrollerでしているため、テストはRequest Specで行う


### APIの共通仕様
* Server Errorを除き、HTTPステータスコードは必ず200で返す
* HTTPレスポンスボディはJSON形式で返す
* 成功時のレスポンス
“`json
{ “status”: 200, “message”: “Succeed”, “data”: … }
“`
* 未認証時のレスポンス
“`json
{

元記事を表示

Amazon Linux 2 の環境で rails c を立ち上げた際、日本語入力をすると Encoding::UndefinedConversionError が出ていたので修正

そもそもの文字の設定が問題でした。

`/etc/sysconfig/i18n` など共通で読み込まれるファイルに下記を追記したら入力できるようになりました。

“`
LANG=en_US.utf-8
LC_ALL=en_US.utf-8
“`

元記事を表示

OTHERカテゴリの最新記事