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

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

Kaigi on Rails 2023に登壇しました

## はじめに

こんにちは。なおとです。

1ヶ月強前の話ですが、10/27(金)-10/28(土)の2日間にわたって開催されました「Kaigi on Rails 2023」に参加、登壇させていただきましたので、その感想を述べたいと思います。

本記事では私の登壇内容について今回はほぼ触れません。
以下のリンクにセッション内容や動画が公開されておりますので、見ていただけると嬉しいです。

https://kaigionrails.org/2023/talks/naoto/

# Kaigi on Railsとは

まず、Kaigi on Railsが何か、簡単に紹介します。
こちら[公式](https://kaigionrails.org/2023/)からの引用です。
> Kaigi on Railsのコアコンセプトは「初学者から上級者までが楽しめるWeb系の技術カンファレンス」です。Kaigi on Railsは技術カンファレンスへの参加の敷居を下げることを意図して企画されています。また、名

元記事を表示

RailsでHTTP OPTIONSリクエストをルーティングする

最近`rails routes`を実行したときに、見慣れないHTTP OPTIONSリクエストのルーティングを目にしたので調べました。

## よくあるルーティング
Railsでは`resources`メソッドを使うことで、あるリソースを操作するコントローラの各アクションにリクエストをマッピングできます。
“`ruby
Rails.application.routes.draw do
resources :products
end
“`
`resources`メソッドでは `GET`、`POST`、`PATCH`、`PUT`、`DELETE`リクエストに対するルーティングは作成されますが、`OPTIONS`メソッドのようにリソースを操作しないリクエストのルーティングは作成されません。

## OPTIONSメソッドとは
> HTTP の OPTIONSメソッドは、指定された URL またはサーバーの許可されている通信オプションをリクエストします。

> レスポンスには、許可されているメソッドを含んだ Allow ヘッダーが入ります。
“`bash
> curl -X OPTI

元記事を表示

【Ruby on Rails】RuboCopでコードの治安を守ろう

## まえがき

本記事は、**[DMM WEBCAMP Advent Calendar 2023](https://qiita.com/advent-calendar/2023/infratop)** 5日目記事です。

Ruby on Railsを中心に、DWCメンター・卒業生が記事を投稿しておりますので、是非他の記事もご確認ください!

## はじめに

こんにちは、DMM WEBCAMP メンターの @ukwhatn です。

本カレンダー3回目の担当日となりますが、今日はRuby on RailsにおけるRuboCopの使い方について説明していきます。

## Rubocopとは?

[RuboCop](https://github.com/rubocop/rubocop)とは、Ruby向けのlinter、つまり静的コード解析ツールです。

:::note warn
**待ってよ、そもそもlinterって?**

linter(リンター)とは、ソースコードを実行前に解析することで、事前にバグやコーディングミスを検出したり、コミュニティやプロジェクトが定めたコーディング規約から

元記事を表示

Import mapsでJavaScriptを管理しているときのstimulus controller登録の仕組み

# はじめに

Railsでstimulusを使う場合は、[stimulus-rails](https://github.com/hotwired/stimulus-rails) gem が使われます。
このgemにより、stimulus controllerを生成できます。
生成されたstimulus controllerは、JavaScriptの管理方法に応じた方法で、登録する必要があります。

JavaScriptの管理方法としてJavaScript bundlerを使う場合は、`register`メソッドを使います。
“`js
import HelloController from “./hello_controller”
application.register(“hello”, HelloController)
“`

JavaScriptの管理方法としてimport mapsを使う場合は、`eagerLoadControllersFrom`メソッド or `lazyLoadControllersFrom`メソッドを使います。
“`js
// Eager load a

元記事を表示

【Ruby】pメソッドとputsメソッドの違い

# 【Ruby】pメソッドとputsメソッドの違い

Rubyにおける`p`メソッドと`puts`メソッドは、どちらも出力を行うメソッドですが、その振る舞いには重要な違いがあります。この記事では、これらのメソッドの特徴と違いを初心者にも分かりやすく解説します。

## pメソッドの特徴

`p`メソッドは、オブジェクトのデバッグ出力に適しています。具体的には以下の特徴があります。

### データ型を明示

`p`メソッドは、オブジェクトの型や内容を明示的に出力します。これにより、データの構造や型を正確に理解することができます。

### `inspect`メソッドの結果を出力

`p`メソッドは、内部的にオブジェクトの`inspect`メソッドを呼び出し、その結果を出力します。これにより、オブジェクトの内部表現を詳細に確認できます。

### 例

“`ruby
p “hello” # 出力:”hello”
p 123 # 出力:123
p [1, 2, 3] # 出力:[1, 2, 3]
“`

## putsメソッドの特徴

`puts`メソッドは、より一般的な

元記事を表示

reCAPTCHA v2 を Rails に導入する方法

# はじめに

ログイン不要のお問い合わせページにbotから入力がありました。
ログイン不要は続けたいものの、botは弾きたいところです。
そこで、今回はreCAPTCHAを入れることで対応を試みました。

reCAPTCHAには、v2 → v3 → Enterprise と様々な種類があります。
参考までに v2、v3、Enterpriseの違いを軽く載せておきます。
詳しくは[google公式記事](https://cloud.google.com/recaptcha-enterprise/docs/compare-versions?hl=ja)をご覧ください

| バージョン | 判定 | 値段 |
| — | — | — |
| v2 | 画像認証 | 無料 |
| v3 | 自動 | 無料 |
| Enterprise | 自動 | 100万回/月以上は有料 |

個人〜中規模開発では通常のreCAPTCHAでの判定で基本は問題ない認識です。

その中でも、v2 は「画像認証が手間だが確実に判断できる」v3 は「自動認証で楽だが人間を却下する可能性がある」という点

元記事を表示

【Ruby】サトシになったつもりでクラスについてまとめてみた(初学者向け)

# はじめに

Ruby Silverの勉強をして身について知識のなかで、クラスについての知識がRailsにも生きていると感じたので、まとめていきます。
Ruby Silver合格までの勉強方法は前回記事でまとめています。
[【プログラミング初学者】Ruby Silverに合格したのでまとめました!](https://qiita.com/fukuidaito/items/c05ade02d8e4aef8d210)
# 目次
| 章 | タイトル |
|—:|————-|
| 1 |[オブジェクト指向の基本的な単語の説明](#基本的な単語の説明)
| 2 |[クラスの定義とインスタンスの作成](#クラスの定義とインスタンスの作成)|
| 3 |[インスタンスメソッドの定義](#インスタンスメソッドの定義) |
| 4 |[インスタンス変数とアクセサメソッド](#インスタンス変数とアクセサメソッド) |
| 5 |[クラスメソッドとクラス変数の重要性](#クラスメソッドとクラス変数の重要性) |
| 6 |[クラスの継

元記事を表示

`dependent: :destroy`のhas_one関連レコードbuild時の奇妙な挙動

ある時、has_oneの関連レコードがすでに紐づいている状態で、build_association_nameで新たなレコードを作成しsaveをしても、特にエラーなどが起きずレコードが置き換わっていることに気づきました。
この挙動が奇妙だったため何が起きているのか調査をしてみることにしました。

## has_oneのbuild_associationでDELETEが実行されていた
rails7.1.2で以下のようなモデルを使って検証をしてみます。
ポイントはhas_oneに対して`dependent: :destroy`のオプションを与えている点です。

“`ruby
class Supplier < ApplicationRecord has_one :account, dependent: :destroy end class Account < ApplicationRecord belongs_to :supplier end ``` Supplierのhas_oneの関連レコードであるAccountを永続化して紐付けた状態にしておきます。 ```ruby i

元記事を表示

Ransack needs associations explicitly allowlisted as searchable…の対処法

self.ransackable_attributesで自身で許可するカラムを、self.ransackable_associationsで関連付けの参照先で許可するmodelを指定できる。
参照先のmodelでは、self.ransackable_attributesで同様にして許可するカラムを指定する。

# 具体例
PostモデルとTagモデルが多:多で、Postの検索でTagのnameカラムを利用したい場合(tag_postsが中間テーブル)
“`ruby:Post.rb
class Post < ApplicationRecord has_many :tag_posts, dependent: :destroy has_many :tags, through: :tag_posts def self.ransackable_associations(_auth_object = nil) #多なので複数形で指定 ['tags'] end end ``` ```ruby:Tag.rb class Tag < ApplicationRecord

元記事を表示

default_scopeが悪ならscopingを使えば良い

Railsの小ネタ。

以下の記事にあるように `default_scope` はバッドプラクティスという風潮があるみたいで、その理由も理解はできる。

Railsのdefault_scopeは使うな、絶対(翻訳)

要するに、default_scopeを使うと一部の処理だけdefault_scopeを外したいといった場面が必ず出てくるが、適切に解除してあげないとバグを生み出す。バグの温床なのでdefault_scope使うな。ということらしい。

そうは言ってもアプリケーションのほとんどの処理に同じscopeを適用するのも適用漏れがありそうで、それはそれでバグの温床な気がする。

そんな時にはscopingを使うと良さそう。

## scoping

https://railsdoc.com/page/scoping

default_scopeがモデルの処理全てにscopeが適用されてしまうのに対して、scopingは処理のブロックの範囲にのみscopeが適用される。

これを適切に運用できれば、scopeを解除するといったバグの温床

元記事を表示

SQLインジェクション、怖くなくね?

 
釣りタイです。怖いねという話をします。

また、本記事はあくまでも学習目的での手法の紹介記事です。
実際に存在するサービス・サーバーへの利用/悪用は絶対にしないでください。

# 本記事について
SQLインジェクション(以下SQLi)で攻撃されちゃうやられアプリ(Rails + MySQL)を作りました。
それに対して実際に攻撃シナリオを考え、それを行うRubyのプログラムも作りました。
本記事ではこれらについて簡単に説明をしていきます。

想定読者は
「SQLiは聞いたことはあるけど攻撃を見たことはない」
ぐらいのRailsユーザーを想定しています。
また、RDSはMySQLでの実行を想定して文章を作成しています。

# SQLiって知ってますか?

### `Robert’); DROP TABLE Students`

ミームとして有名なやつです。

後述するアプリで言うところの
“`ruby
User.where(“email = ”); drop table posts; — “)
“`
的なものRailsでやってみたことありますか?

mys

元記事を表示

Stimulus controllerの登録方法の違い

# はじめに

Railsでstimulusを使う場合は、[stimulus-rails](https://github.com/hotwired/stimulus-rails) gem が使われます。
stimulus-rails gemの大まかな機能は以下です。
– Stimulus インストーラー
– Stimulus controller ジェネレーター

このジェネレーターで生成される stimulus controllerの登録方法は、JavaScriptの管理方法で違いがあります。
その違いについて、まとめます。

# 登録方法

stimulus-rails gemは、JavaScriptの管理方法として以下をサポートしています。
– JavaScript bundler
– Import maps

この管理方法によって、stimulus controllerの登録方法が違います。
それぞれの登録方法について以下に記します。

## JavaScript bundler

JavaScript bundlerを使っている状態で、`bin/rails stimulus:

元記事を表示

bin/devってなんだ

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

[前回の記事](https://qiita.com/eichann/items/1b7683584b6f88593513)でDockerを使って環境構築を行い、そのまま猫Rails様の[猫でもわかるHotwire入門 Turbo編](https://zenn.dev/shita1112/books/cat-hotwire-turbo/viewer/tutorial-1)を読み進めていました。

すると、「サーバを立ち上げるときは`rails s`じゃなくて`bin/dev`を使うよ」という箇所に差し掛かりました。これは全く知りませんでした。キャッチアップを怠ってきたことの~~老害~~弊害が出ているなと、早くも感じております。

また、この`bin/dev`コマンドをDocker環境で利用するにあたり少しつまづいたところもあったので、そのあたりも備忘録兼ねてまとめます。

# bin/devって何?

`bin/dev`コマンドは、Rails7において`rails s`コマンド

元記事を表示

日付の比較処理を見かけたら UTC+ いくつか意識してレビューしたいお話

# UTC+なんなのか意識してレビューとコーディングをしたい

`Time.current.class` は `=> ActiveSupport::TimeWithZone` であり現地時間を取得できる
`Date` 型は 世界標準時 `UTC + 0` を参照する

そのため `to_date` を用いて型変換しない場合 は `UTC+9` の時間を追加すると比較できる

“`ruby
[78] pry(main)> product.start_date
=> Wed, 29 Nov 2023

[79] pry(main)> product.start_date <= current_day + 8.hour => false

[80] pry(main)> product.start_date <= current_day + 9.hour => true
“`

境目は 8時間59分59….. +9時間すると正しく動作する

# 実際にあった怖い話

DateTimeオブジェクトとTimeオブジェクトをコード内で同列に扱って
日付判定ロジックでミスった話

公開日が

元記事を表示

【Rails】include と extend と ActiveSupport::Concern

`include` と `extend` の違いってなんだ?
内部では何が起きているのか..?

`ActiveSupport::Concern` を使うにも `included` 使うけど何をしているのか

`ActiveSupport::Concern`を使う際に学んだことをメモします。
## [extend](https://docs.ruby-lang.org/ja/latest/method/Object/i/extend.html)について

– `extend` したクラスのシングルトンクラス(特異クラス)のインスタンスメソッドとして追加できる
– `extend`したモジュールのメソッドはクラスメソッドのように呼び出せる

順を追うと…

### シングルトンクラスとは…
**あるオブジェクト専用のクラスであり、そのオブジェクトだけに属する**
[こちらが参考になります](https://qiita.com/k-penguin-sato/items/d637dced7af32e4ec7c0)
ちなみに[object.singleton_class](https

元記事を表示

Rails7.0.5から7.0.5.1への変更点

## 対象
Railsのバージョンを**7.0.5**から**7.0.5.1**に変更する人

## 情報ソース
Rails Versions 7.0.5.1, 6.1.7.4 have been released!
https://rubyonrails.org/2023/6/26/Rails-Versions-7-0-5-1-6-1-7-4-have-been-released

## 変更点
– `redirect_to`による脆弱性の対応

## 詳細
`redirect_to`を使っている場合にクロスサイトスクリプティング(XSS)の攻撃が発生する可能性がある模様。
ただし、`redirect_to`を使っている場所全てで発生するということではなく、**外部のホストにリダイレクトを許可している場合**に発生しうるというものです。
外部ホストにリダイレクトを許可する設定は
“`rb
redirect_to ‘https://example.com’, allow_other_host: true
“`
こんな形でallow_other_hostをtrueに意図的にする必要

元記事を表示

Docker使ってrails newしたい時にすぐできるtemplateを作った

## はじめに

こんにちは!
まるべいじです!

個人開発でちょっと作りたくなった時に、どのような構成で構築していますか?
私は、Rails+Docker+その他必要なものにしています。
Dockerがあると環境差分が減って開発しやすくなりますし、デプロイ先の選択肢も増えるので、この構成は外せません。

ただ。。。Docker経由で`rails new`するのが地味にめんどくさい。。。
`rails new`用のDockerに`ruby`や`node`のインストール、`rails`だけはいった`Gemfile`など、細かい調整がいろいろ必要です。

すぐに開発したいのに、ここでモチベーションがちょっと下がる。これは良くない!と思ったので、今回はRailsのセットアップをするTemplate Repositoryを作りました✨

:::note info
Template Repository とは???
この機能を使うと、あらかじめ設定されたリポジトリをベースにして新しいプロジェクトを簡単に始められます。
つまり、Template Repositoryは「繰り返しの労力を減らす」ため

元記事を表示

Ruby on Rails カラムの追加/データ型変更/削除

ポートフォリオ制作でdocker-composeコマンドを使ってカラムの追加/データ型変更/削除を行ったので備忘録として記載しています。

前提条件
ruby’3.1.3′
rails’7.0.4′
docker-compose ‘3.8’

apiと書かれた部分は適宜読み替えてください。

### 既存のテーブルに新しいカラムを追加する
(usersテーブルにbadgeというカラムを追加する例)
1.新しいマイグレーションファイルを作成する
“`
docker-compose run –rm api rails generate migration add_badge_to_users badge:boolean
“`
2.以下のマイグレーションファイルが生成される
“`
class AddBadgeToUsers < ActiveRecord::Migration[7.0] def change add_column :users, :badge, :boolean end end ``` 3.rails db:migrateを実行 ``` docker-c

元記事を表示

位置情報系RubiestがMySQLを5.7から8.0にした話

静岡市でWeb開発しているkazuomatzです。

以前、[こちらの記事](https://qiita.com/kazuomatz/items/884c7b5e64a3b7532204)で、Rails + MySQL で位置情報を扱う時に標準だったライブラリ [activerecord-mysql2spatial-adapter](https://github.com/rgeo/activerecord-mysql2spatial-adapter)について書きました。

ライブラリの開発が止まってしまい、新しいRailsのバージョンに更新しようとすると対応されていないので、リポジトリをforkして、Rails6.0で何とか動かした話です。

今年、AWSの[RDSのMySQL5.7系のサポートの終了](https://blog.serverworks.co.jp/eos-rds-for-mysql57x)がアナウンスされました。2024年2月以降、RDSでMySQL5.7を利用し続けるには、有償の延長サポートに入る必要があります。

というわけで今年は、MySQL5.7で稼働している

元記事を表示

RailsでCSVインポートとエクスポート機能を実装

# 0. はじめに
Railsで基本的なCSVインポートとエクスポートを行う

# 1. 事前準備
“`: config/application.rb
require “csv”
“`

“`:app/views/users/index.html.erb
<%= form_with url: import_path do |form| %>
<%= form.file_field :file, accept: "text/csv" %>
<%= form.submit "CSVインポート" %>
<% end %>
“`
# 2. CSVインポート
“`:app/controllers/import_controller.rb
class ImportController < ApplicationController def create User.import_csv(file: params[:file]) if params[:file].present? redirect_to users_path end end ``` ```:

元記事を表示

OTHERカテゴリの最新記事