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

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

Next.jsとRailsを使った認証とエラーハンドリング

# 1. はじめに
ウェブアプリケーションの開発において、ユーザー体験を向上させるためには、認証の管理が重要です。今回は、ログインしていないユーザーでも投稿詳細を確認できるようにし、ログインしていないユーザー保存や応募ボタンを押すとログインを促す実装を行いました。この記事では、その際起きたエラーとそれに対するアプローチについて解説します。

# 2. 何をしたかったか

1. **ログインしていないユーザーでも投稿詳細を確認できるようにする**
– ユーザーがアプリケーションにログインしていなくても、投稿の詳細情報を閲覧できるようにしたい。

2. **保存や応募ボタンを押すとログインを促す**
– ユーザーが投稿を保存したり、応募したりするボタンを押した際に、ログインしていない場合はログインページにリダイレクトして、ログインを促すようにしたい。

これにより、ユーザーはログイン前に投稿の内容を確認でき、必要な操作を行う際に適切にログインを促されることで、よりスムーズで安全なユーザー体験を提供することができます。

# 3. セキュリティの考慮
認証に関する処理を適切に

元記事を表示

deviseのdevise_parameter_sanitizer.permitとconfig.authentication_keysで詰まった話

# TL;DR
認証キーと許可するパラメータの違いを把握していなかった。
– config.authentication_keysはdeviseの認証として使われるものであり、自動的にストロングパラメータとして登録されている
– devise_parameter_sanitizer.permitはストロングパラメータの設定であり、deviseの認証として使われるものではない

# 誤解していたこと
devise_parameter_sanitizer.permitとconfig.authentication_keysは同じもの!
↑誤りですので気をつけてください。。

つまり、
“`ruby:application_controller.rb
devise_parameter_sanitizer.permit(:sign_in, keys: [:name])
devise_parameter_sanitizer.permit(:sign_up, keys: [:name])
“`
“`ruby:config/initializers/devise.rb
config.authen

元記事を表示

Rails7.1、ruby3.34を詰まらずインストールしたい人へ

rubyのインストール中にライブラリ不足によるコンパイルエラーが複数回発生し、解消したら次のエラー、それも解消したらまた次の・・・のように無駄に時間がかかったので、スムーズにインストールできるようにまとめてみました。

## 環境
WSL(Ubuntu 22.04.4 LTS)

## 手順

### 必要なライブラリをインストール
“`console
sudo apt update -y
sudo apt upgrade -y
sudo apt install build-essential -y
sudo apt install -y libssl-dev libreadline-dev zlib1g-dev libyaml-dev libz-dev libffi-dev
“`
### rbenvとrubyをインストール
“`console
# rbenvをインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo ‘export PATH=”$HOME/.rbenv/bin:$PATH”‘

元記事を表示

Ruby技術者認定試験に合格してみて【Silver編】

## はじめに
2024年の6月27日に**Ruby Association Certified Ruby Programmer Gold version 3**(以下「Ruby Gold」)に合格しましたので、どのように勉強したのか、実際に役立ったのか等を**Silver編**と**Gold編**の二つに分けて記事にしようと思います。
Silverは90点で合格しました。

![スクリーンショット 2024-07-08 21.22.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636995/3ea1d68e-c013-4d17-1e75-c222c1cef8a5.png)

## Ruby技術者認定試験とは

Rubyベースのシステムを設計、開発、運用するエンジニア、Rubyでシステム提案を行うコンサルタント、Rubyを教える講師及びRubyを学ぶ学生などを対象とした認定試験制度です。

### Silver
Rubyの文法知識、Rubyのクラスとオブジェクト、標準ライブラリの知識について、基

元記事を表示

[Rails] controllerで、configというメソッド名は使用するな!

# はじめに
`Controller`を実装中に、以下のエラーに遭遇しました。
`※ 多少表示を変えています。`

“`sh
undefined method `allow_forgery_protection’ for #
“`

心当たりのないエラーだったので、どのように解消するか悩みました。
今回は解消内容をアウトプットいたします。

# エラー原因
`Controller`内で`config`というメソッド名は、使用できませんでした。

https://qiita.com/ironsand/items/2834496d23380dc3f65d

今回自分が作成したメソッドは以下になります。

“`rb
def config
@config ||= Rails.application.config_for(:test)
end
“`

ymlファイルを呼び出すのをメモ化するために作成したメソッドの命名を、`config`にしていました。
それが、今

元記事を表示

GrapeでGETのクエリパラメータにArray[Integer]のTypeを使いたいときのメモ

# 概要
– GETのクエリパラメータにArray[Integer]を設定してみたがうまく動作しなかった
– そのときのメモ

Grapeはこれ

https://github.com/ruby-grape/grape?tab=readme-ov-file

# 結論

* `collectionFormat: ‘multi’` を追加する

“`ruby
requires :xxx, type: Array[Integer], documentation: { desc: ‘メモ’, type: ‘integer’, param_type: ‘query’, collectionFormat: ‘multi’ }
“`

この辺にドキュメントがある

https://github.com/ruby-grape/grape-swagger?tab=readme-ov-file#collection-format-of-arrays-

# 困ってたこと

* フロントエンドでGrapeが生成するyamlファイルを元に、ApiClientを生成していたが、リクエストすると `

元記事を表示

Railsのフォロー機能実装中にbelongs_toの書き方を間違えてActiveRecord::AssociationTypeMismatchエラーが出た話

## 読んで欲しい人

– belongs_toの書き方をちゃんとわかってない人
– ActiveRecord::AssociationTypeMismatchエラー出た人
– 過去の俺

## 動作環境

– ruby 3.3.0
– Rails 7.1.3.3

## やってたこと:悪い例

フォロー機能を実装してました。

– フォローする側:follower
– フォローされる側:followed

“`user.rb
class User < ApplicationRecord has_many :active_relationships, class_name: 'Relationship', foreign_key: 'follower_id', dependent: :destroy, inverse_of: 'follower' end ``` ※ フォローされる側の実装はしていない ```relationship.rb # このファイルの記述が間違ってた。 class Relationship < ApplicationRecord belongs_

元記事を表示

Rails view helperとテストのリファクタリング:モックをcode smellと感じること

## はじめに

自称、Ruby on Rails フロントエンドエンジニア:joy_cat:のnaofumiです。X [@naofumi](https://x.com/naofumi)では色々勝手なことを書いていますが、最近Qiitaも頑張り始めました。

## 先日のview helperテストのリファクタリング

先日、[Railsのviewテストを書こう](https://qiita.com/naofumik/items/9136c830ed3b8a16b4e8)って記事を書いたが、[view helperおよびそのテストのコード](https://qiita.com/naofumik/items/9136c830ed3b8a16b4e8#現状の並べ替えのステートによって並べ替え矢印の表示を変えるヘルパー)があまりイケてなかった。

そこで今日は、view helperテストのリファクタリングを一緒に考えていきたいと思う。

## 対象のコード

作ろうとしている`ordering_arrow` helperメソッドは、下記のようなテーブルの並べ替えに使う三角ボタンの箇所。

元記事を表示

RailsのCSRF保護について

今回は新規プロジェクトで実際に遭遇した**CSRF保護**について学んだことをまとめます。

## CSRFとは
CSRF(Cross-Site Request Forgery)を簡単に説明すると、悪意のあるユーザーがサーバーへのリクエストを捏造して正当なものに見せかけ、認証済みユーザーを装うという攻撃手法です。Railsでは、一意のトークンを生成して送信のたびに真正性を確認することでこの種の攻撃から保護します。
(引用サイト:https://techracho.bpsinc.jp/hachi8833/2021_11_26/46891)

これだけでは「なんのこっちゃ、、。」となるため噛み砕いて説明します。
もしかしたら一度は見たことあると思いますが、HTMLのheadタグに「= csrf_meta_tags」なんて見たことはありませんか?
※コードはslim形式になっています。

その「= csrf_meta_tags」が私たちが気づかないうちに、セキュリティーをかけていてくれました。

## 「= csrf_meta_tags」の役割
この記述の役割としては、サイトのHTMLに一意

元記事を表示

サービスクラスとは?

## サービスクラスとは?
Ruby on Railsのアーキテクチャ内で特定のビジネスロジックや操作をカプセル化するためのクラスです。
コーディングをしている時にアプリケーションのコントローラーやモデルが肥大化してしまうということがあると思います。

サービスクラスを使用することで、これらのロジックを適切に分離し、各クラスの責任を明確に保つことができます。
使用する時には、特定のビジネスルールや操作を一元管理する時に使用します。

## 導入メリット
Ruby on Railsでアプリケーションを開発する際、モデルやコントローラーにビジネスロジックが集中すると、コードが複雑になり保守性や拡張性が低下してきます。

サービスクラスを導入することで、ビジネスロジックを分離するとこで、コードの整理、テストのしやすさ、バグの早期発見、新機能の追加やリファクタリングの効率が上がります。

## モジュールだはダメなの?
このような機能で似たものとして、モジュールがあります。しかしなぜモジュールはダメなのかというと、インスタンス変数が持てないということが理由です。

サービスオブジェクトは、通常

元記事を表示

予定の10分前にメール通知を飛ばす機能を作ってみた!

## はじめに
社内のハッカソンで(ほぼ)初めてActionMailerとActioveJobを使ってみました。
まだ自分の中で、何の機能を誰が担うのかの整理ができていないので、復習を兼ねて記事にしてみました!

※本番環境にデプロイしていません。
## 動作環境
ruby 3.3.1、Rails 7.1.3.3
## 読んで欲しい人
ActiveJob、ActionMailerの存在は知っていて、使ってみたいと思っている人。
## 実装すること
全体のざっくりした機能の流れとしては、ユーザが予定の外出時間の登録or更新をした時に、その外出時間の10分前に確認メールを飛ばすといったものです。
もしユーザがすでに予定の外出時間を登録していて、外出時間の更新をした場合、更新前の外出時間をもとに飛ばそうとしていたメールをキャンセルし、新たにメールの通知予約を作成します。
## 実装
※ UserモデルとUserに紐づくCalendarモデルは作成済みです。
### 予定の10分前に飛ばすメールを作成
まずはメールを作成します。
※今回は準備物を確認を促す通知なので、↓のような名前で作成しまし

元記事を表示

Rails におけるMigration対象のファイルには順番がある件

# はじめに
みなさん、こんにちは.**torihazi**です。

昨日作ったRails7 x React 18 のDocker環境の下で

現在開発を進めているのですが、

久しぶりのRailsで、はじめの始めでつまづいたので

書き記しておこうと思います

# どういうことか
例えばテーブルを4つ(A,B,C,D)作るとします。

そのためにターミナルで下記コマンドを打ち込むかと思います。

“`
rails g migration createAs
rails g migration createBs
rails g migration createCs
rails g migration createDs
“`
そうするとファイルがそれぞれ
“`
20241111001111_create_as.rb
20241111002222_create_bs.rb
20241111003333_create_cs.rb
20241111004444_create_ds.rb
“`
と作られます。

この時
– BはAのidを外部キーとしてもち
– CはAとBとDのidを外部キ

元記事を表示

【Rails】一つのモデルに対して複数の意味を持たせたい(class_name, inverse_of )

# 実現させたいこと
例えばユーザー(User)と本(Book)のモデルが存在している時
Userに二つの意味を持たせたいことがある
– 本を所有しているユーザー(User)
– 本の著者(Author)

“`rb
book.author
# => 本の著者を取得
book.user
# => 本の所有者を取得
“`

同じUserモデルを使って、author、userをそれぞれ取得できる

# モデル作成
マイグレーションファイルは以下のようにBookに外部キーとして
– user_id
– author_id

を持たせます
“`rb
class CreateBooks < ActiveRecord::Migration[7.1] def change create_table :books do |t| t.belongs_to :user, null: false t.belongs_to :author, null: false t.timestamps end end end ``` モデルは下記のよ

元記事を表示

【環境構築】Rails + Docker + Bootstrap

# 開発をするためのディレクトリを作成する
“`
mkdir 自分で開発するアプリの名前
“`
# Dockerfileを作成する
“`
touch Dockerfile
“`
# Dockerfileの中身を書く
“`
# 使いたいバージョンを決めて{{}}をruby:tag名の形で置き換えてください
# 例: ARG RUBY_VERSION=ruby:3.2.2
ARG RUBY_VERSION={{rubyのimage名:tag名}}
# {{}}を丸ごと使いたいnodeのversionに置き換えてください、小数点以下はいれないでください
# 例: ARG NODE_VERSION=19
ARG NODE_VERSION={{nodeのversion}}

FROM $RUBY_VERSION
ARG RUBY_VERSION
ARG NODE_VERSION
ENV LANG C.UTF-8
ENV TZ Asia/Tokyo
RUN curl -sL https://deb.nodesource.com/setup_${NODE_VERSION}.x | bash

元記事を表示

【Rails】erbをVSCodeでフォーマットする方法

## 拡張機能をインストール

ERB Formatter/Beautifyという拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=aliariff.vscode-erb-beautify&ssr=false#overview

## Gemをインストール

上記の拡張機能を使用するためにはHTML Beautifierが必要なのでインストールします。

“`Gemfile:Gemfile
group :development do
gem ‘htmlbeautifier’
end
“`

で`bundle install`。
または、ターミナルで以下のコマンドを実行します。

“`terminal:ターミナル
gem install htmlbeautifier
“`

https://github.com/threedaymonk/htmlbeautifier?tab=readme-ov-file#installation

## 設定を記述する

`settings.json`に以

元記事を表示

Rails 7 x React 18(Javascript) x Docker 環境構築

# はじめに
みなさん、こんにちは **torihazi**です

つい最近までReactを勉強していたのですが、

最近Rails ReactのSPAを勉強することになり

これまで扱っていたDockerを使って環境構築をしてみることにしました。

Javascriptなので、実用性は低いかもしれませんが

まずはJavascript!という方は参考にしてください!

実務未経験なのでディレクトリ構成など、おかしいところあるかもしれません

そんな時はこそっと教えてください!

# 環境
“`
docker compose v2.28.1-desktop.1
docker engine 27.0.3
“`

# ディレクトリ構成について
“`
|- docker-compose.yml
|- Dockerfile.back
|- Dockerfile.front
|- front(git管理)
|- 色々(create-react-appでこれから作る)
|- back(git管理)
|-Gemfile
|-Gemfile.lock
|-entrypoi

元記事を表示

【Rails】画像プレビュー機能をJavaScriptで実装

# はじめに
この記事ではRailsでアップロードした画像をJavascriptでプレビュー表示させる方法についてまとめています。すでに画像のアップロード自体はできている方を前提として書いておりますのでご了承ください。JSについては不慣れなところがあり恐縮です。

https://railsguides.jp/active_storage_overview.html

# 対象者
### 環境
– Ruby 3.2.3
– Rails 7.1.3.2
– esbuildで開発
– Tailwindcss使用

### 前提
– Active Storageの導入が完了している
– 画像のアップロードができている
– 1つのフォームでなく複数のフォームでプレビュー表示させたい方

↓参考記事

https://qiita.com/taki39384/items/691017789c1ca594f308

# 完成品

1つだけでなく複数のフォームに対応できます。

### 新規作成画面

[![Image from Gyazo](https://i.gyazo.com/23827c2db

元記事を表示

Rails: あなたがService Objectでやりたいことは、たぶんActiveRecordで1行でできる

## はじめに

自称、Ruby on Rails フロントエンドエンジニア:joy_cat:のnaofumiです。X [@naofumi](https://x.com/naofumi)では色々勝手なことを書いていますが、最近Qiitaをやろうかなと思っています。

それでは本題です!

## Rails歴が長くても、Railsの便利機能が使えていない人は多い

私はフリーランスとして、ここ数年でいろいろなRuby on Rails案件に入ってきました。その中で強く感じるのは、Railsの便利機能をしっかり使いこなしている人が少ないということです。これは一見シニアっぽい人でもそうです。

とても残念なので、使いこなしている人が少ない便利機能に主に焦点を当てて、Railsの素晴らしさをなるべく多くの人に知っていただこうと思っています。

[前回のviewのテストの記事](https://qiita.com/naofumik/items/9136c830ed3b8a16b4e8)もその一つでした。

今回は、ActiveRecordで関連オブジェクトを一気に作る複数の方法を紹介します。

元記事を表示

単体テストコード MySQLのエラー解消

モデル単体テストコードを実装している最中に
`MySQL client is not connected`というエラーが発生した場合の対処方法は↓
config/environments/test.rbというファイルに以下の記述を追記しましょう。

“`
Rails.application.configure do

#省略

config.active_job.queue_adapter = :inline #追記

#省略
“`
## Active Jobのキューアダプタ設定
これはRailsのバックグラウドジョブフレームワークです。
デフォルトのジョブは非同期で行われるが`:inline`に設定する事でジョブは非同期ではなく、同期的に実行されます。
## ジョブの実行タイミング
`inline`に設定する事でジョブが即座に実行されるよになります。これはテスト環境で特に有効的です。
理由はテスト中にバックグラウンドでジョブが実行されるのを待つ必要がなくなり、テストの実行がより予測可能になるからです。
## テスト解消の理由
テスト環境で非同期ジョブを使用すると、ジョブが非

元記事を表示

僕のrubocom設定

# はじめに
基本のrubocop設定を自分用の備忘録として記述します。

# Rubocopとは
RuboCop とは、Ruby のコードがコーディング規約に沿っているかを検査することができる「静的コード解析ツール」の一つです。
RuboCop をアプリケーションに取り入れることで、コードの品質を保つことができます。

# Rubocop 基本設定

“`ruby:.rubocop.yml
AllCops:
# チェック対象から除外するディレクトリ,ファイル
Exclude:
– “vendor/**/*”
– “db/**/*”
– “bin/*”
– “node_modules/**/*”
– “config/initializers/devise.rb”
– “config/environments/*.rb”
– “Gemfile”
– “Rakefile”

# # frozen_string_literal: true というマジックコメントのないファイルの許可
Style/FrozenStri

元記事を表示

OTHERカテゴリの最新記事