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

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

【Rails 7】アプリを日本時間に

# 【Rails 7】アプリを日本時間に

## 前提
・Ruby 3.2.2
・Rails 7.0.8

## config/application.rbファイルの編集
タイムゾーンを変更する
“`config\application.rb
class Application < Rails::Application config.time_zone = "Asia/Tokyo" end ``` ## 表記の変更 年:%Y、月:%m、日:%d 時:%H、分:%M、秒:%s スラッシュや漢字などを挟むときは、上記表記の間にそのまま入れる ```ruby:html.erb <%= user.created_at.strftime('%Y/%m/%d') %>
<%= user.created_at.strftime('%Y/%m/%d %H:%M:%S') %>
<%= user.created_at.strftime('%Y年%m月%d日') %>
<%= user.created_at.strftime('%Y年%m月%d日 %H時%M分%S秒') %>
“`

元記事を表示

Ruby on Rails form_withメソッドにおけるsubmit後のURL

参考となる記事一覧

https://qiita.com/RIN_HM/items/464827b6055aa9748425

https://qiita.com/YokoYokoko/items/77d0043e12406c7cec9e

元記事を表示

【個人開発】初心者🔰が診断ロジックを1から実装した話📕

## はじめに

先日、ユーザーの疲労タイプを診断して、診断結果にて漫画+アロマをお勧めするWebアプリを作成しました。
![文字あり.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3732604/b933a8e5-1d60-ae67-f5aa-6fb3968b3278.jpeg)

https://www.comic-health.com/

このサービスの肝になる診断ロジックの構築が大変だったので、記録しておこうと思います。
今回の診断ロジックは、回答によってポイントを加算し集計する方法で実装を行いました。

## ER図
![漫画の処方箋-ER図.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3732604/2b0d01be-b5b9-10f6-d953-87f52b3694d1.jpeg)

## 1. 診断ロジックを考える(実装前)
### 1 はじめに決めたこと
– 質問の数(10個)と内容
– Yes

元記事を表示

Rails 通知メールを送信する

# はじめに
今回Xクローンの実装にてメールにて通知を送る機能の実装をしたので、自分自身の備忘録として、また今後実装する方のお役に立てればと思いこちらの記事を書くことにしました。

# メール機能の作成
要件として、`いいね` `リポスト` `コメント` `フォロー`をされた場合、web上の通知画面とともにメールを送信して通知をお知らせする機能を実装する。

※前提としてSendGridとletter_opener_webを使用できる状態であること。

# メールを送信する
#### メーラーを作成する
“`
rails g mailer User
“`

#### ルーティングの設定
これは開発環境で使用するルーティングになります。
“`ruby:routes.rb
mount LetterOpenerWeb::Engine, at: ‘/letter_opener’ if Rails.env.development?
“`

#### サーバーの設定
メールを送信するときは、送信するサーバーが必要。と言うことで、メール送信設定を記述します。

**開発環境**
“`rub

元記事を表示

【Rails】楽天APIで一度に複数のジャンルIDで検索してみた

## はじめに
Railsでのアプリ作成で楽天APIを使用することになったのですが、その際に一度の検索で複数のジャンルIDを使用した検索機能を実装しました。使用機会は多くないものだと感じましたが、記事にまとめたいと思います。

※このページの情報は2024年3月時点の情報となります。公式の最新情報などと照らし合わせてお読みください。

## 楽天APIの使用準備

まず、楽天APIの使用準備について簡潔に解説したいと思います。

(1) [Rakuten Web Service](https://webservice.rakuten.co.jp/)のページに移動

(2) 右上にログインボタンや言語選択ボタンがあります。言語を選択してRakuten Web Serviceのアカウントを作成し、ログイン。

(3) ログイン後、言語選択ボタン近くの「アプリID発行」の項目をクリック。新規アプリ登録画面に映るので、必要な項目を入力。

(4) アプリ登録後は「アプリ情報の確認」をクリック。アプリ一覧画面が表示されますが、その項目にあるアプリID(applicationId)が楽天APIを

元記事を表示

[ゆるふわ] Next.js+Railsの良いとこどりのアーキテクチャを考える

### なぜやるか

Rails7でHotwireが導入され、擬似SPA開発ができるようになり、
私的にはかなり開発体験もUXも向上したように感じます。
Hotiwireの威力をまだ感じてない人はぜひ使ってみて欲しいです!

しかし、フロントエンドにおいてDomの操作をガチャガチャし出すと、Hotwireではやはり辛くなります。
そこでガチャガチャしたいページはNext.js、それ以外のサクッと作りたいページをRailsで作れるようなプロジェクトを作ってみたいと思います。

# ▼ システムの全体
X(旧twwiter)にようなシステムを想定

### 画面
ユーザー向け
– タイムライン(`/timeline`)
– 投稿画面(`/timepine/post`)
– ダッシュボード(`/dashboard’)
– プロフィール(`/profile`)

システム管理者向け
– 管理画面

### 概要図
システムに基づいてページとシステム構成図を図示すると以下のイメージです。
タイムライン(`/timeline`)投稿画面(`/dashboard`)はUI/UXが複雑になると仮定

元記事を表示

Ridgepoleの導入手順と使い方

## はじめに
**自己紹介**
 未経験からWEB系エンジニアへの転職を目指している者です。現在はRuby on Railsを学習中です。

**この記事を書いたきっかけ**
 現在、ポートフォリオとしてRailsアプリを開発している中でRidgepoleを導入したので、導入手順と使い方、自身が詰まったところなどを備忘録として残すため記事にしました。

## 動作環境
– mac OS Sonoma 14.4
– ruby 3.2.2
– rails 7.0.7
– mysql:8.0.34

## 目次
[1. Ridgepoleとは](#ridgepoleとは)
[2. 導入手順](#導入手順)
[3. Ridgepoleの使い方](#ridgepoleの使い方)
[4. Ridgepoleを導入したらGithub ActionsのCIが通らなくなった話](#ridgepoleを導入したらgithub-actionsのciが通らなくなった話)

## Ridgepoleとは
[公式リポジトリ](https://github.com/ridgepole/ridgepole)のREA

元記事を表示

マイグレーション、DB周りの便利なコマンド集

## はじめに
スクールの課題で、タスク管理アプリを作成しているときにマイグレーションファイルに記載している内容が、`$ rails db:migrate`してもschemaファイルに反映されないことがあり、マイグレーションの復習も兼ねてアウトプットします。修正や追加等ありましたら、コメントいただけるとありがたいです。

## 環境
・MacBookAir 13インチ M1(2020)
・OS:Sonoma 14.3
・メモリ:16GB
・Rails: version 6.1.7.6

## マイグレーションとは?

データベースの中にテーブルを作成するするために必要なもの。マイグレーションファイルを使用してデータベーススキーマに変更を反映させる仕組みです。RailsのマイグレーションファイルはRubyのプログラムで書き実行します。

**テーブルの作成**、**カラムを追加・削除**、**インデックスの追加**、**スキーマに対するあらゆる変更**は、都度マイグレーションファイルを作成してスキーマに反映するという流れをとる。したがって、データベーススキーマの変遷の歴史がマイグレーショ

元記事を表示

ActiveRecord::Reflection で Model 間の関連付け情報を取得する

株式会社学びと成長しくみデザイン研究所の藤澤です。

## はじめに

Rails の各 Model 間の関連付けの情報を実装上で取り扱うにあたり、ActiveRecord にはそれを取り出すためのメソッドとその情報を管理するクラスが用意されています。

今回は、以下のような Model を例に説明を進めていきます。
“`rb
# 1つのAuthorに複数のBookが紐付き、1つのBookに複数のPageが紐づく。
# Author の主キーは code で、Book における外部キーは author_code。
class Author < ApplicationRecord self.primary_key = :code has_many :books, foreign_key: :author_code end class Book < ApplicationRecord belongs_to :author, foreign_key: :author_code has_many :pages end class Page < ApplicationRec

元記事を表示

Rails + Vue.js:ドキュメントのロード完了後にVueアプリをマウントする方法

RailsとVue.jsを組み合わせたアプリケーション開発では、ページのDOMが完全にロードされてからVueインスタンスをマウントすることが重要です。特にRailsのビューで`javascript_pack_tag`や`vite_javascript_tag`を使う際にこの問題は顕著になります。この記事では、DOMのロード完了を待ってからVueアプリケーションをマウントする方法と、そうしない場合の違いについて解説します。

## `DOMContentLoaded` を使用する理由

“`javascript
document.addEventListener(‘DOMContentLoaded’, () => {
const calendarEl = document.getElementById(‘weekly-calendar’);
if (calendarEl) {
createApp(WeeklyCalendar).mount(calendarEl);
}
});
“`

上記のコードでは、`DOMContentLoaded` イベントリスナーを使用し

元記事を表示

【ruby】 nil を渡さない 返さない

## はじめに
最近、コードレビューで「なるほど~⭐️」と思うことがあったので備忘録としてまとめようと思いました。
それは、**プリミティブな `nil` を返却するとそれ自体が意味を持ち始め、コードの意図が伝わりにくくなる**というものでした。

## nilを返したくない理由
– ロジックの至る所で`nil`を意識した設計になり、コードを読む時や機能追加する時に **`nil`が返却されるかどうかの丁寧な確認が必要** になるのでだるい

– `nil` が返されることで**条件分岐が発生し、可読性の低いコードを書いてしまいがち。**

– **「nilが返却される」 というのが一種の暗黙的な仕様になる。**

## nil を返すことで引き起こされる悲劇

では悲劇が起こる前…

タスクと1週間のタスクを管理するようなクラスがあるとします。

“`ruby
#
# タスククラス
# 何曜日に実行されないといけないか知っている
#
class Task
TODO = ‘todo’
DOING = ‘doing’
DONE = ‘done’

attr_

元記事を表示

viteとimportmapの競合による期待しないHTTPメソッドの挙動の解消について

# Rails 7 でのログアウト処理問題とその解決策

Railsアプリケーションで以下のようにログアウトリンクを設定している場合、

“`erb
<%= link_to 'ログアウト', destroy_user_session_path, data: { turbo_method: :delete } %>
“`

次のエラーに直面することがあります。

“`bash
ActiveRecord::RecordNotFound at /users/sign_out Couldn’t find User with ‘id’=sign_out
“`

Rails 6 では以下の方法でログアウトリンクを記述していましたが、

“`erb
<%= link_to 'ログアウト', destroy_user_session_path, method: :delete %>
“`

Rails 7 からは `data: { turbo_method: :delete }` を使用する必要があります
※そうしないとGETメソッドで予期しないリンク先に遷移しようとします。
しかし、この

元記事を表示

Railsで画像を保存するメモ

## ソースコード
“`ruby
def create
# 登録用
product = Product.new(name: params[‘name’], price: params[‘price’], description: params[‘description’])

if params[:image]
extension = File.extname(params[:image].original_filename)
random_filename = SecureRandom.uuid + extension
product.image = random_filename
image = params[:image]
File.binwrite(“public/products/#{product.image}”, image.read)
else
product.image = “defalut.png”
end

if product.save

元記事を表示

【Rails】bundle install時のmysql2エラーの解消方法

# 概要
ローカルの Ruby on Rails で `bundle install` を実行したときに、mysql2のインストールで以下のエラーが出てしまうことがあります。

“`ruby
Installing mysql2 0.5.6 with native extensions
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

# (略)

Gem files will remain installed in
/Users/watasho/study/batch_sample/.bundle/ruby/3.2.0/gems/mysql2-0.5.6 for inspection.
Results logged to
/Users/watasho/study/batch_sample/.bundle/ruby/3.2.0/extensions/arm64-darwin-22/3.2.0/mysql2-0.5.6/gem_make.out

# (略)

An error occurred whi

元記事を表示

Ruby on Railsのモジュラーモノリス化を推し進めるpacks-railsというgemがすごいという話📦

こんにちは、akitoshigaです。

現在Ruby on Railsのモジュラーモノリス化を行っており、その際に利用した`packs-rails`というgemが大変便利だったのですが情報が少なかったので紹介します。

## 1. packs-railsとは?
一定の規則に従って、単一のRails on Railsアプリケーションをモジュール分割するgemです。
このgem単体でも利用できますが主に[packwerk](https://github.com/Shopify/packwerk)と組み合わせて使われることが多いと思います。
`packwerk`とはRuby on Railsの静的解析を行うgemでモジュールごとの依存関係の管理ができます。

https://github.com/rubyatscale/packs-rails

## 2.一体何がすごいのか?
### 2.1 (ほぼ)設定不要
`packs-rails`は内部で`zeitwerk`というgemを利用しています。
`packs-rails`の指定のディレクトリ構成に従えば、`zeitwerk`のおかげで面倒

元記事を表示

Ruby on Railsでコントローラー名と紐づいているもの

コントローラー名をBooks→Testに変える場合

### routes.rbにて名称変更
/kakeibo/config/routes.rbを下記の通り変更する。

get “/books”, to: “books#index”

get “/books”, to: “test#index”

### コントローラーファイルの名前を変更

/kakeibo/app/controllers/books_controller.rb

/kakeibo/app/controllers/test_controller.rb

### ファイル内のコントローラー名を変更する
/kakeibo/app/controllers/books_controller.rbを下記の通り変更する。

class BooksController < ApplicationController ↓ class TestController < ApplicationController ### viewsのフォルダ名を変更 /kakeibo/app/views/books ↓ /kakeibo/app

元記事を表示

DeviseとCanCanCanを併用したセキュリティ保護

細かいことを飛ばして具体例を見たい場合は以下のリンクへどうぞ(私自身、備忘録的に見返すならばこの部分になると思っています)

https://qiita.com/KM9973/items/0b132f0ac91322939d44#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%82%B1%E3%83%BC%E3%82%B9
# RailsアプリケーションでのDevise導入と認証の基本

### 導入

RailsアプリケーションにDeviseを導入した際、すべてのビューがログインせずともアクセス可能な状態になってしまうことがあります。これは、適切な認証フィルターが設定されていないために発生します。

### 解決策

#### ApplicationControllerでの認証フィルターの設定

アプリケーション全体でユーザーがログインしていることを要求するには、`ApplicationController`に`before_action :authenticate_user!`を設定します。これにより、全てのコントローラーでアクションが実行される前に

元記事を表示

Rails DM機能の実装

# はじめに
今回はXクローンの実装にてDM機能の実装をしたので、自分自身の備忘録として、また今後フォロー機能を実装する方のお役に立てればと思い今回も記事を書くことにしました。

# DM機能の作成
要件として、ユーザー同士(1対1)でメッセージを送り合うことができる機能を実装する。
※ 前提として、ユーザー登録がすでに実装されているものとします。

# DM機能の流れ
相手ユーザーの詳細ページorポストのメニューorサイドバーのメニューからチャットに進む

roomがなければ新規で作成され、そうでなければ存在するroomに遷移する

roomでメッセージを送ることができるようになる

このように至って普通なDM機能を実装していきたいと思います。

# DM機能について
DM機能では、usersテーブル、roomsテーブル、entriesテーブル、messageテーブルを使用します。

2人のユーザーがチャットルームでメッセージをやりとりするというイメージを思い浮かべながら実装していきます。

まず、ユーザーを管理するusersテーブルがあります。
ユーザーはroomsテーブルと

元記事を表示

webサーバーはフレームワークに組み込まれている

# はじめに
webアプリケーションフレームワークはwebアプリ開発を助けるツールとして広く用いられています。例えばPythonのDjangoやRubyのRuby on Rails, JavaのSpring bootなどが挙げられるでしょう。それらはアプリケーションサーバーにおけるMVCモデルを提供するフレームワークであると多くの場合説明がされますが、実は簡易的なWebサーバーも持ち合わせています。勉強した今考えれば当たり前なのですが、勉強しながら少し混乱したところでもあるのでここにまとめます。

# 3層構造とMCVモデル
まず復習ですが、webアプリケーションは三層構造になっています。
①プレゼンテーション層
②アプリケーション層
③データ層
ここで①はクライアントから来たリスエストを捌き、クライアントのウェブブラウザ上に情報を提供する働きを、②はプレゼンテーション層から送られてきた指示に従って動き、アプリケーションの動的部分を担います。③はデータを管理している層で、アプリケーション層からの指示(例えば顧客情報を出す)に従ってデータベースからデータを提供します。そして、これらの3つ

元記事を表示

Parallel gemで実装した処理をRspecでは同じスレッド上で動かす

以下のようにParallelにて処理を並列スレッドで実行しているとき、

“`ruby:hoges_controller.rb
def index
procs = [
-> { hoge1 },
-> { hoge2 },
-> { hoge3 }
]
result = Parallel.map(procs, in_threads: 3, &:call)
end
“`
Rspecではletやsubjectが変数に対してロックを獲得するため、複数スレッドで変数の参照待ちになりデッドロックが発生し、テストが永遠に終わらなくなってしまう

それを解決するために、Rspec上では直列で処理を実行するようParallelをモックして、ブロックを呼び出すだけにする

“`ruby:hoges_controller_spec.rb
describe ‘#index’ do
subject { get hoges_path }

# Parallel.mapの引数で渡された配列をmapしてcallするだけ

元記事を表示

OTHERカテゴリの最新記事