Rails関連のことを調べてみた

Rails関連のことを調べてみた
目次

DockerでRails(7.1.2) x MySQLの環境を構築し、DockerでHerokuにデプロイする

## はじめに
#### 何者か
RUNTEQ Advent Calendar 2023の11日目を担当いたします。raytoです。
RUNTEQというプログラミングスクールに通い始めて2ヶ月が経過しました。

初めて技術記事を書きますのでご容赦ください、と言いつつ、誤った情報やより効率の良い方法などがあればぜひ教えていただきたいです。

#### 背景
今回は、DockerでRails+MySQLの環境を構築して、DockerでHerokuにデプロイする手順を紹介します。GitでHerokuにデプロイする記事は多くみられましたが、Dockerでデプロイする方法に関する記事は多くないと思ったので書いてみました。
今回ご紹介する以外にも色々な方法や設定内容が考えられると思いますが、これからDockerを使用してRailsアプリを開発しようと思っている方は、一例として参考ししていただければ幸いです。

#### 補足
・本手順ではRailsアプリの開発が行える最小限の構成に近いものが出来上がるので、利用したいCSSフレームワークなどがあれば別途設定してください。
・GitHub上でのRai

元記事を表示

Rspecでanythingを使うとエラーになってしまう

# はじめに

Rspecでモックを使おうとしたところ時間がかかってしまった箇所があるので書いておきます

# 問題

テストの引数のチェックで`anyting`を利用しました

“`rb
Api.should_receive(:update_new_document).with(shortname, anything())
“`

すると以下のエラーが発生します

“`
Failures:
(Api).update_new_document(“A-00001”, #)
expected: 1 time
received: 0 times
# ./spec/jobs/update_all_worker_spec.rb:19:in `block (5 levels) in

Finished in 2.68 seconds
1 example,

元記事を表示

Active Recordのカラム名としてobject_idが使えるようになった 他(This week in rails 2023-12-08)

## これはなに
Railsコミッタが連載している[This week in Rails](https://world.hey.com/this.week.in.rails)の内容を、簡単な補足と併せて紹介する連載です。社内slackで毎週書いていたものですがもったいない気がしてきたので公開することにしました。

## 引用元
https://world.hey.com/this.week.in.rails/allow-object_id-as-a-column-name-for-active-record-and-a-lot-more-112f1943

## 今週のトピック

### [Active Recordのカラム名としてobject_idを使用できるようになった](https://github.com/rails/rails/pull/50162)
Active Recordの有効なカラム名としてobject_idを使用できるようになった。
(紆余曲折あったみたい)

### [Time.now/DateTime.now/Date.todayが#travel_toの後にシス

元記事を表示

Railsで環境変数を設定する

# 1. gemインストール

“`:gemfile
gem ‘dotenv-rails’
“`
※ある記事で、 `gem ‘dotenv’`と記載があったが、これでは上手くインストールできないので注意。

https://github.com/bkeepers/dotenv

# 2. 環境変数を設定する
リポジトリの一番上の階層で、`.envファイル`を手動作成

以下のように設定したい環境変数を設定
“`:.env
ID=123a
“`
”シングルクオーテーションは不要。key=value形式で良い。

# 3. サーバ再起動
環境変数はサーバ起動時に読み込まれる。
そのため、サーバ起動しているのであれば、再起動する。

# 4. 環境変数の確認
rails c でコンソールを起動し、以下の形式で確認ができる。

“`:コンソール
irb(main):001> ENV[“ID”]
=> 123a
“`

元記事を表示

[初投稿]投稿を削除しようとしたらmodelのbelongs_to :user,dependent: :destroyが原因でできなかった話

# 前提
– Rails7
– ローカル環境
## 何のために?
レシピを投稿するアプリを削除するリンクを作ったら削除されずエラー画面もでなかった件。またあるだろうから自己対応用に
## エラーが起きたときの状況
レシピの詳細画面からレシピを削除できるようにリンクを貼っていた。
“`show.html.erb
<% if user_signed_in? %>
<% if @recipe.user_id == current_user.id %>
<%= link_to 'レシピを削除する',recipe_path(@recipe.id), data: { turbo_method: :delete, turbo_confirm: " 本当に削除しますか?" }/ %>
#ログイン状態かつ自分の投稿である場合、確認をとって削除する。
<% end %>
<% end %>
“`
本来なら、削除が成功して投稿一覧画面なりに飛ぶはずが削除されずエラー画面も出ない。これは困った。
## ログを見てみよう

![スクリーンショット 2023-12-04 7.30.11のコピ

元記事を表示

Dockerコンテナを立ち上げただけでフォーマッターの設定を一瞬で完了させられるようにするDev Containersのススメ

[ACCESS Advent Calender](https://qiita.com/advent-calendar/2023/access) 2023年の11日目の記事

## 背景
理想(個人的な意見)
– GitとDockerを入れて、git cloneしてdocker-compose buildすれば環境構築完了
– 既存メンバーの環境を新規メンバーが忠実に再現可能

現実
– 色々とごちゃごちゃ入れなければならない
– 他の案件やリポジトリのためにした設定の影響を受ける可能性があり、原因の切り分けも難しい
– 時が経つと、それぞれの人が個人的に入れている拡張機能やbrewやaptで入れているもの、ワークアラウンド対応(一時的な回避策)が満載になり、新規メンバーが同じ環境にするのは無理

→環境構築は辛くて、面倒で思った通りにできない。

### Dockerの限界
Dockerを使っても解決しそうだが、エディタはローカルで操作するため、以下のものは結局手動で入れる必要がある。
– エディタの個人設定(settings.jsonや.vscodeにするような設定)

元記事を表示

【Rails】パスを見てDBを切り替えるとテストが落ちるのを回避

# 概要

前回「パスによってDBのアクセスを変更する」といった記事を書きました

https://qiita.com/yothio/items/e2cfbbee215d0dfab324

普通に使う分には問題なかったのですが意図せずテストがコケてしまったので調査を兼ねて残しておきます

結論としては「**Rspecのhookでコネクションをデフォルトに接続し直す**」ことで回避しました

具体的に状態、問題、解決方法について見ていきます

## 状態
問題が発生したコードは以前の記事で説明した通り以下の要件を満たすものです
– Railsでマルチデータベース構成を行う
– マルチデータベースでは異なるスキーマを取り扱う
– Contentテーブルにnameカラムの有無
– PostテーブルとCardテーブルが片方にしかない
– マルチデータベースの接続切り替えはモデル単位ではなくアクセスするパスを参照

「原則としてはAデータベースを参照するが、特定のパスから始まる場合はBデータベースを参照。同一のテーブルがあってもカラムが異なる」という状態です

## 問題
次に発生した問

元記事を表示

RailsのTurbo Framesを利用してシンプルな遅延読み込みを実現

# はじめに

Railsアプリでデータベースの内容を表示する際、データベースのクエリーが返ってくるまでに時間がかかる場合に、結果が返ってくる前の段階でスケルトンを表示したいことがありました。

# Turbo Framesの利用

この挙動はTurbo Framesの遅延読み込みを導入すれば解決できそうと考えて調べていたところ、以下の記事が参考になりそうでした。

https://railsnotes.xyz/blog/simple-lazy-loading-hotwire-turbo-frames-rails

## 遅延読み込み先の設定

“`ruby:app/controllers/welcome_controller.rb
class WelcomeController < ApplicationController def index_lazy @contents = Content.all.limit(10) end end ``` ```erb:app/views/welcome/index_lazy.html.erb <%= turbo_frame

元記事を表示

【挫折回避】Docker Composeを使ってWebアプリを5分でdocker化してみる(Rails×postgreSQL)

※この記事は「[Happiness Chain Advent Calendar 2023](https://adventar.org/calendars/9414)」11日目の記事です。

## はじめに
この記事では、「Dockerとは」のような詳しい説明は省略し、とりあえず「WebアプリをDocker化する」という点のみにフォーカスし、その流れを簡潔に紹介しています。

:::note warn
※私自身Dockerの学習を始めたばかりの者です。そのため、このあと記載している内容の中には、おかしな点、間違っている点があるかもしれません。もしそのような点に気付かれた方がいましたら、コメントで指摘していただけますと幸いです。
また、今後学習を経て本記事の内容を変更する可能性もあります。あらかじめご了承ください。
:::

## 対象の読者
– Dockerについて勉強を始めたばかりの人(イメージとコンテナぐらいは何となく理解している程度)
– 現場でDockerを使っているけど何が起こっているのか分からない人
– とりあえずWebアプリをDocker化して、Web

元記事を表示

JqueryでRedmineの「活動ページ」をもっと便利に②(フィルタリング機能と移動機能)

## JqueryでRedmineの「活動ページ」をもっと便利に②(フィルタリング機能と移動機能)

[Redmine Advent Calendar 2023](https://adventar.org/calendars/8974)の11日目の記事として作成しました。

* * *
### 既存のRedmineで不便なこと、改善したい点

必要とする情報を網羅的に全て取得して、そこから確認をしたい情報を絞り込むことで、「探したい」情報、「確認したい」情報に漏れなくアクセスすることができます。そのため、Redmineでは「チケット」、「ガントチャート」、「カレンダー」などのページで「フィルター」機能が提供されています。
Redmineで標準で提供されているフィルター機能はかなり強力で、柔軟な条件で情報の絞り込みを直感的に行うことができます。

チケットページのフィルター機能Rails7でいいね機能を非同期化について

# はじめに
いいね機能を非同期化する目的として、**リアルタイムなフィードバック**を行うことと**ユーザーエクスペリエンスの向上**をあげると思ったのでこの記事を書こうと思いました。

### 開発環境(ざっくりと書きます)
– ruby 3.2.0
– Rails 7.0.8

## やることの手順

### 1.gem “jquery-rails”を導入します
“`application.jsのファイル
//= require jquery
//= require rails-ujs
ここにもしbootstrapなど呼び込みの記述があってリンク先が邪魔しないように記述(自分の場合は最後に記述)
“`
Gemfaileにgem “jquery-rails”を導入しbundle installを実行

### 2.まずいいね機能のrenderで呼び出す記述を書いておきます
“`_like.html.erb
<% if user_signed_in? && article.liked_by?(current_user)%>
<%=link_to artic

元記事を表示

完全に理解するTurbo Streams

# 完全に理解するTurbo Streams
## 概要
– turbo-rails gemを使用したturbo_streamの実装方法がわかるようになります。
– Rails6系以前のrails-ujsを使用したAjax機能の代替となるものをTurbo Streamsを使用して作るための説明がメインです。
– broadcastについては説明しません。

## Ajaxの話
Turbo StreamsはRails6系以前のAjaxの実装とイメージが近いのでまずAjaxについて簡単に概要を説明します。
Ajaxは「Asynchronous JavaScript and XML」の略称で、この技術を用いるとページを再読み込みしなくても画面を更新することが出来ます。

Ajaxを理解するにはまず、Webブラウザの基本的な動作について理解しておく必要があります。
ユーザーが何かのリンクをクリックするとブラウザはサーバーに対してリクエストを1つ送信します。
ブラウザは、サーバーから受け取った情報を見て、0からユーザーに見せるための画面を作成します。
0から画面を作成するためサーバーが返す情報は

元記事を表示

rails newしたら何が起きるか?

現在、CRUDを学ぶべくTODOアプリを作成していたのですが

以前、Railsを学習したときに

“`ruby
rails new アプリ名 _6.0.0_ -d mysql
“`

このコマンドを打った事を思い出しました。

しかし、色々な記事や動画、リファレンスを見ていると

“`ruby
rails new アプリ名
“`

これだけでも雛形が作成できると書いてあります。

### `rails new`したら何が起きているかというと

– **新しいアプリケーションの「土台」が作成される**:
新しいアプリケーションのための基本的なファイルやフォルダが自動的に作成されます。これは、家を建てる時にまず土台を作るようなものです。アプリの土台ができることで、開発を始める準備が整います。

– **必要なファイルの自動生成**:
アプリケーションを開発する際に必要となる多くのファイルが自動的に生成されます。これには、アプリの設定ファイル、初期の画面を表示するためのファイルなどが含まれます。この自動生成機能により、開発者は一から全てを作り出す手間を省けます。

元記事を表示

【Rails】タグ登録、重複させないためにはコツがいる

アクセスしていただきありがとうございます。
Rails初学者です。
学習の一環として記事投稿アプリを作成中です!
躓いたところについてアウトプットしていきたいと思います。
修正やご意見ありましたらどうぞお聞かせください。(何卒)

## 状況
– Ruby on Railsで記事投稿アプリを作成中。
– ユーザーが記事を投稿する際に、タグを入力し記事に反映させる機能を実装中である。
– タグ同士を , (カンマ)で区切り、複数のタグを保存できる機能を作している。

## やりたいこと
登録しようとしているタグが重複している場合、重複して保存されないようにしたい

## 書いてみたコード
“`ruby:post.rb
class Post < ApplicationRecord # ... (中略) ... # 入力フォームで入力されたタグを連結する def tag_list tags.map(&:name).join(', ') end # タグを保存する際に重複を削除する def tag_list=(names) self

元記事を表示

Railsにおける「1.month」と「1.month.ago」の内部実装の違いを探る

この記事は、[Ruby on Rails Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ruby-on-rails)の10日目の記事です。

# はじめに
[@yayamochi](https://twitter.com/yayamochi)です。業務でRuby on Railsを使ったバックエンド開発に取り組んでいます。

皆さん、Ruby on Railsにおいて、「1.month」はどういった値を返すかご存知でしょうか?

最近、時間操作でよく使う「1.month」を通してトラブルに遭遇しました。

頻繁に利用されるはずの「1.month」が思わぬ落とし穴につながることがあるので、実装を深掘り[^1]していきます。

# 実際に遭遇したトラブル

「1.month」の仕様を勘違いしており、誤ったTTL[^2]を設定してしまい、Redisのデータを消失してしまうというトラブルに遭遇しました。

開発している

元記事を表示

【Rails】初心者様向けアソシエーション解説 book.user編

# はじめに
こんにちは!
**DMM WEBCAMP mentor Advent Calendar 2023** :christmas_tree: **10日目** を担当します
@A22Dです!
初めての記事執筆となりますが、今回、Railsの「アソシエーション」に焦点を当て、その基本をわかりやすく説明したいと思います。
初心者の方でも「なるほど!」と思っていただけるよう心掛けますので、最後までお付き合いください!

# 概要
初心者の方へ、Railsの「アソシエーション」をわかりやすく解説します。
アソシエーションとは、モデル間の関連性を定義する強力な機能です。この記事では、例として`book.user.name`や`book.user.introduction`を用いて、投稿された本の作者の名前やプロフィール画像の取得方法を紹介します。

# 前提環境

– Ruby 3.1.2
– Rails 6.1.7

# 目次
1. [1:Nの関係について](#1nの関係について)
– [user.rbのアソシエーション](#

元記事を表示

Turboのチュートリアル記事を読んでいる最中の疑問

# はじめに
本記事は錆びかけたRailsの知識を頑張ってアップデートするアドベントカレンダー8日目です。

今日は、猫Rails様のTurboのチュートリアルでRails7のTurbo Streamを勉強していたときに浮かんだ疑問についてまとめます。

# 疑問点
**Turbo Streamと「○○.js.erb」との違いは?**
**flash.noticeとflash.notice.nowとの違いは?**
**指定ページの強制リロードは本当にできる?**

## Turbo Streamと「○○.js.erb」との違いは?
非同期の実装について、Rails6までは、Railsでbuttonタグやaタグを作ってくれるメソッドbutton_tagやlink_toなどに`remote: true`というオプションをつけ、そこからのリクエストを非同期にするという方法がありました。

“`erb:例
<%= hoge_path, method: :post, remote: true do %>
<%= image_tag "path-to-image", alt: "Like"

元記事を表示

JqueryでRedmineの「活動ページ」をもっと便利に(タイトルを開閉したり、曜日を入れたり)

## JqueryでRedmineの「活動ページ」をもっと便利に
[Redmine Advent Calendar 2023](https://adventar.org/calendars/8974)の9日目の記事として作成しました。(11日目に公開をする予定でしたが、9日目に誰も投稿者がいなかったため、急遽、公開日を変更しました。)

* * *
### 既存のRedmineで不便なこと、改善したい点

Redmineの「活動ページ」は時系列でチケットの作成、編集を一覧できるページです。その為かなり大量の情報が表示され、縦スクロールを頻繁にする必要があります。せっかく日付ごとにグルーピングされていますが、縦スクロール以外に他の日付を閲覧、表示させる方法がなく、不便を感じていました。
また、グルーピングのタイトルが「2023/12/02」のように日付のみで表示されているため、該当の日付が何曜日であるのかがわからず、曜日を確認をするためには別途、カレンダーを確認をしなければならない煩雑性がありました。

現状の活動ページransackをクエリパラメータで指定する方法

# この記事について
この記事は [SUPER STUDIO Advent Calendar 2023](https://qiita.com/advent-calendar/2023/superstudio) の9日目の記事になります。

# この記事を書こうと思った理由
仕事でRestAPIを使ってGETリクエストする際に、ransackをクエリパラメータで指定して検索条件を指定することがあるのですが、改めて使い方などを整理したいと思い、また、自分の知らなかった機能も最近知る機会が合ったので、改めてまとめてみようと思いました。

# そもそもransackとは
ransackをそのまま日本語訳するとあまり印象の良くない翻訳になりますが、簡単に言うとRailsのActiveRecordにおける検索機能を実装するgemになります。

# 使い方
基本的には[こちらのドキュメント](https://github.com/activerecord-hackery/ransack/blob/main/docs/docs/getting-started/search-matches.md)通り指

元記事を表示

Ruby + Rspec – テスト失敗のエラー時にアフターフック処理して赤文字でカスタムメッセージを標準出力する ( example単位 )

after each の中で exception を参照すれば検証失敗エラーのときだけに何らかの処理ができる

通常Rspecはどのように検証が失敗したかを丁寧に表示してくれるが
テストの構成上、標準出力で詳細が分かりづらい場合はアフターフックを仕込んで、何か標準出力させておくとデバッグがしやすいかもしれない

( たとえば Rails の Requestのテストの時に response body を標準出力するなど )

# 例

“`rb
describe ‘Test’ do
after(:each) do |example|
if example.exception

puts “\033[31m” # 赤字開始 – 標準出力で文字色を付ける

puts example.full_description # Test It Description
puts example.description # It Description
puts example.location # /path/to/spe

元記事を表示

OTHERカテゴリの最新記事