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

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

開発環境のpumaをsystemd経由で自動起動/制御する

## はじめに
開発環境のpumaをsystemdに登録し、systemctlを使って起動・停止などの制御をするようにします。

## 環境
* AlmaLinux 9.3
* Ruby 2.7.8
* Rails 6.1.4.7
* puma 5.5.2
* sd_notify 0.1.1

## sd_notifyのインストール
“`ruby:Gemfile
gem ‘sd_notify’
“`
Gemfileにsd_notifyを追加してbundle installします。

## systemdのユニットファイルを作成
“`/usr/lib/systemd/system/puma-app01.service
[Unit]
Description=App01 hosted by puma
After=network.target

[Service]
WorkingDirectory=/path/to/app01
ExecStart=/bin/bash -lc ‘bundle exec pumactl start’
User=app01
Group=apps
Type=no

元記事を表示

Railsでreadonly属性が設定されたinputにおいて、プルダウンが操作可能な問題への対処法

※この記事は僕がぶち当たった問題をとりあえずChatGPTくんに丸投げしてライティングしてもらったものです。

# はじめに
Railsアプリケーションでinput要素をreadonlyに設定することは、フォームの入力を無効にし、特定の値を表示する場合などに一般的です。しかし、readonly属性を持つinput要素にもかかわらず、プルダウンが選択できてしまうという問題が発生することがあります。

この記事では、そのような問題が発生した場合の対処法について解説します。

# 問題の再現
まず、問題を再現してみましょう。以下は、readonly属性を持つinput要素とプルダウンが含まれる簡単なフォームの例です。
“`erb
<%= form_for @model do |f| %>

<%= f.label :name %>
<%= f.text_field :name, readonly: true %>
<%= f.label :status %>

元記事を表示

勉強会での小話4

# はじめに

この記事は2023年度の振り返りです。

こちらの続きとなります。

https://qiita.com/youfuku/items/ccdafe5ccf1abd2d9fb7

問題を解いてる時の実話を元に、作成しております

# 勉強会内の小話
前回(has_many祭り)の続きです。

初学者達:これでどうだ!

“`ruby:app/models/author.rb
class Author < ApplicationRecord has_many :writes, foreign_key: 'user_id' end ``` ```ruby:app/models/write.rb class Write < ApplicationRecord belongs_to :author, foreign_key: 'user_id' belongs_to :comic, foreign_key: 'book_id' end ``` ```ruby:app/models/comic.rb class Comic < ApplicationRecord

元記事を表示

【Rails】rails_helperファイルについて、またその中で設定できること

## rails_helperファイルとは

:::note
【**rails_helper**ファイル】

**RSpecの実行に必要不可欠なファイルの一つであり、RSpecの設定をまとめて書いたファイル**。

* 各ファイルの先頭に、必ず `require “rails_helper”` を記述する
* spec ディレクトリ配下のテストで共通して使用される設定ファイル
* Railsの環境を利用するために(作成したファイルと連携させるために)記述必須

`require “ライブラリ名”`

別の場所に配置したファイルを読み込んで、そのファイルで定義されたクラスやメソッド利用することができます。その際に利用するのが、requireです。require関数は、標準ライブラリやインストールしたライブラリから使用する場合にはライブラリ名を渡すことで使えます。
:::

## 設定例
#### `ENV[‘RAILS_ENV’] = ‘test’`
環境変数RAILS_ENVを’test’に設定することで、Railsがテスト環境用の設定を読み込む。これにより、テストを実行する際にRa

元記事を表示

勉強会での小話3

# はじめに

この記事は2023年度の振り返りです。

こちらの続きとなります。

https://qiita.com/youfuku/items/a579bcb4506c73475200

問題を解いてる時の実話を元に、作成しております

# 勉強会内の小話

初学者達:よし!次の問題に行きましょう!

講師:え?いやいやいや・・・・他の解き方もあるでしょ?

初学者達:え?ありますっけ?

講師:ほら・・・結合のあれだよ。ジョ・・・

初学者達:ジョジョの奇妙な冒険!

講師:んなもん、ねーよ!joinな!

初学者達:あーjoinですね!知ってますよ!

講師:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/5cdc1ce5-c85f-9351-a288-ecdc5f211473.png)

初学者達:has_manyとbelongs_to使えばサクッと終わるやつですね。

講師:ほう。じゃぁ、まずはリレーションを組んでみよう

初学者達:こんな感じでどうですか?

元記事を表示

勉強会での小話2

# はじめに

この記事は2023年度の振り返りです。

こちらの続きとなります。

https://qiita.com/youfuku/items/344d7b522670694e304c

問題を解いてる時の実話を元に、作成しております

# 勉強会内の小話

初学者達:でも、pluckで配列にして少しずつやった方がデバックしやすくないですか?

講師:確かに。デバックで考えるとそうだけど、SQLでinに渡せる上限値っていくつかしってるか?

初学者達:・・・。上限って、あるんですか?

講師:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3632357/04ecf476-4747-4472-2f97-9805185d063d.png)

講師:・・・普通にあるぞ。

講師:軽く調べてみよう。

https://qiita.com/tondemonai7/items/93bf71714f7f828c0164

講師:記事は古いが、DBの種類によって上限値はまちまち。

初学者達:な

元記事を表示

勉強会での小話1

# はじめに

この記事は2023年度の振り返りです。

こちらの続きとなります。

https://qiita.com/youfuku/items/ad1cfd0712709eaabdc1

問題を解いてる時の実話を元に、(実験で)対話形式で書いてみました

# 問題
こんなテーブルがあったとする
(テーブル構成に突っ込みどころは多数あると思いますが、割愛して見逃してください)

“`sh:作者テーブル
irb(main):003> Author.all
Author Load (0.4ms) SELECT `authors`.* FROM `authors`
+—-+———–+————————-+————————-+
| id | name | created_at | updated_at |
+—-+———–+————————-+————————-

元記事を表示

何番煎じかわからないけどRailsのトランザクション処理について

この記事は [trocco® Advent Calendar 2023](https://qiita.com/advent-calendar/2023/trocco)

21日目の記事になります。

こんにちは。trocco開発メンバーのいとうです。最近一気に寒くなりましたね。

この記事では最近ハマっていたRailsのトランザクション処理について書こうと思います。(何番煎じだよ)

先に結論だけ書くと、よくわからず使っているという私みたいな人は公式をちゃんと読み解いて、コード読んだり
実際に手を動かして書いてみると理解できると思います。

なので、私の記事は読まなくていいので、APIリファレンス読んでない人は読んでおくと良いです。
– [ActiveRecord::Transactions::ClassMethods](https://api.rubyonrails.org/classes/ActiveRecord/Transactions/ClassMethods.html)

# 最初にまとめ

– `ActiveRecord::Base.transaction` ブロックはネス

元記事を表示

Railsアソシエーション: 中間テーブルを使用した関連性の構築

## 多対多のアソシエーションとは?
多対多のアソシエーションは、2つのモデル間に直接の関連性を持たせる代わりに、中間テーブルを使用して関連を構築します。これにより、柔軟性が向上します。

## 例: 学生と科目の多対多のアソシエーション

Studentモデル
“`
class Student < ApplicationRecord has_many :enrollments has_many :courses, through: :enrollments end ``` Courseモデル ``` class Course < ApplicationRecord has_many :enrollments has_many :students, through: :enrollments end ``` Enrollmentモデル ``` class Enrollment < ApplicationRecord belongs_to :student belongs_to :course end ``` この例では、StudentとCourseが多対多の

元記事を表示

MVCモデルについて

### MVCモデルとは
プログラムの役割を
・Model
・View
・Controller
の3つに分ける考え方です。


#### Controllerとは
ユーザからリクエストを受けてレスポンスを返す役割です。

#### Viewとは
画面表示(HTML)を担当する役割です。

#### Modelとは
DB関連の処理を担当する役割です。

### -処理の流れ-
例:特定のブログ記事1件を表示するリクエストが送られてきた場合

ブラウザから記事を閲覧したい[http://xxx/blogs/1]とリクエストが送られてきました。
※blogs/1なのでid=1になります。

**Router**というところが呼び出されます(RouterはControllerを呼び出す役割)。

「ブログ記事1件を表示したい」とリクエストされたため、RouterはControllerの中の**blogsContorollerというクラス**を呼び出します。

今回は「ブログ記事1件を表示したい」とリクエストを受けたため`show`アクションが呼び出されます。
※Contr

元記事を表示

wicked_pdfの後継になる?FerrumでHTMLからPDFを生成する

# はじめに

:::note info
この記事は「[mofmof Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mofmof)」22日目の記事です。
:::

`wicked_pdf`の代替案として`Ferrum`というgemを使ってみました。

元々はPDF生成機能を実装するために`wicked_pdf`を使おうとしていましたが、
依存している`wkhtmltopdf`が今年に入ってアーカイブされていたことを知りました。
内部的に利用している`QT Webkit`レンダリングエンジンのメンテナンスが止まったことで、`wkhtmltopdf`もメンテナンスが継続できなくなってしまったようです。

# wicked_pdfの現状

`wicked_pdf`は`wkhtmltopdf-binary`と併せて利用しますが、`wkhtmltopdf-binary`のメンテナンスが滞っているようです。

willnetさんがM1 Mac(arm64)対応やdebian12(bookworm)対応をしてくださったPRが

元記事を表示

【AWS】【Rails】ログインリクエストをSQLiだと判定されてしまった際のメモ

# はじめに
※当記事にはWAFの設定に関しての具体的内容は含まれていない旨ご了承ください🙏
Rails及びAWSを活用した案件開発を行っていたある日のことでした

# 問題
「特定のユーザーがログインしようとした際、必ずエラー画面が表示されてしまうので調査頂きたい」といった趣旨のお問い合わせがありました。
ひとまずアプリケーションのログをAthenaで追ってみても問題事象に関連していそうなログが残っておらず、一見して原因が分からないという状況でした。

# 今回の対処法: WAFの検証ルールを緩和
アプリケーションのログに何も残っていないという点から、より前段で止まっていると仮定してWAFのログを確認しました。すると以下のようなログが残っていました
~~~
AWS-AWSManagedRulesSQLiRuleSet
MANAGED_RULE_GROUP
BLOCK
[{conditiontype=SQL_INJECTION, location=BODY, matcheddata=[authenticity_token, &, user, [login_name], –dayo&

元記事を表示

Railsでinputにdisabled属性を指定した場合のパラメータ送信に関する注意点

※この記事は僕がぶち当たった問題をとりあえずChatGPTくんに丸投げしてライティングしてもらったものです。

# はじめに
Railsアプリケーションを開発する際、フォームのinput要素にdisabled属性を指定すると、そのinputからの値はサーバーに正しく送信されないという現象があります。本記事では、この問題に対する対策と回避策について説明します。

# 問題の概要
disabled属性が指定されたinput要素は、ユーザーからの入力を受け付けないようになりますが、それによってその値がフォームからサーバーに正しく送信されなくなります。これは、セキュリティ上の理由からブラウザがこのような挙動を示すためです。

# 対策方法
## readonly属性の利用
disabled属性と同様に、readonly属性もinput要素を読み取り専用にしますが、異なる点としてreadonly属性を指定したinputはフォームから値を正常に送信できます。そのため、readonly属性を使用することで、ユーザーが値を変更できないようにしつつ、値を正しく送信することができます。
“`erb
<%

元記事を表示

Stripeを利用したサブスクリプション導入におけるシステム連携注意ポイント

## はじめに

BitStarのモリヤです。
[BitStar Advent Calender](https://qiita.com/advent-calendar/2023/bitstar)21日目です。

現在開発中の[BitStar Match](https://bitstar.tokyo/match/)というプロダクトでは定額課金制の有料機能を提供しています。
サブスクリプション機能を実現するにあたり、以下の観点から外部サービスである**Stripe**を利用することとなりました。

– 決済処理実装の工数削減
– クレジットカード情報等の機密情報のシステム側での保持が不要

https://bitstar.tokyo/match/

#### Stripeとは

オンライン決済処理を安全かつ簡単に導入可能にするサービス。

https://stripe.com/jp

![スクリーンショット 2023-12-21 11.08.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/260734

元記事を表示

「Loco」をCloud Runで実行する

## はじめに

[PONOS Advent Calendar 2023](https://qiita.com/advent-calendar/2023/ponos)の22日目の記事です。

最近Ruby on Rails(以下Rails)を触っていると、「うーん、型が欲しい」とわがままな悩みを抱えていました。
そこでC#のBlazorを触りはじめ、「おー!型だ!」と喜んでいました。
ただBlazorを触っていると「書きずらいな…」とさらに悩みを抱えました。(シンプルに努力不足)
そんな贅沢な悩みを抱えている中、
「RailsライクなWebフレームワークがRustからでたぞ!」
という記事を拝見し「どんなものか…」と触り、「あ、めっちゃRailsや」と感動したので今回のアドベントカレンダーの記事にすることにしました。
## Locoとは?
クラスメソッドさんがまとめてくださっているので引用させていただきます。
> Loco は、Rails からインスピレーションを得た Rust用のWebフレームワーク
> ほぼすべての Rails 機能が含まれている
>> Controller

元記事を表示

【Rails】TailwindCSSでフラッシュメッセージを実装してみた

この記事は「[RUNTEQ Advent Calendar 2023](https://qiita.com/advent-calendar/2023)」の22日目に参加しています:christmas_tree:
## はじめに
こんにちは、あっぴー(@super-appy)と申します。
プログラミングスクールに通ってRuby on Railsを学習しています。
初学者のため、内容に誤りや不足がある場合はコメント等いただけますと幸いです。
宜しくお願い致します。

## 記事の概要
現在、ポートフォリオとなるアプリを開発しています。
カリキュラムではBootstrapを使っていましたが、今回はTailwindCSSを使用しています。
TaillwindCSSでのフラッシュメッセージの実装についてまとめてみました。

### 完成イメージ
[![Image from Gyazo](https://i.gyazo.com/0c83c11508d3a8bab5870aff64a85746.gif)](https://gyazo.com/0c83c11508d3a8bab5870aff64a8

元記事を表示

社内勉強会開催したった

# はじめに
[Hubble Advent Calendar 2023](https://qiita.com/advent-calendar/2023/hubble)の16日目[^1]です!
[^1]:平日のみの投稿なので22日ですが16日目の記事としています。

Hubbleでバックエンドエンジニアをしている @power3812 です。オブジェクト指向大好きマンで、神クラスを作れないかと模索の日々です:innocent:

[前回はコードレビューの観点](https://qiita.com/power3812/items/5556f5381b5e6de3565a)について投稿しました。

Hubbleのバックエンドチームはありがたいことに業務委託の方を含めて11人います。しかし、大人数になってくると同じ仕様でも各人によってロジックが変わったり変数名が違ったりという課題が出てきます。また、それらを毎回レビューするのは、レビューワーの負担が大きくなります。
そのため、どうにかコードの書き方をある程度統一化できないかと勉強会を開催しました!

## 開催方法
勉強会は、発表者が一方的に話

元記事を表示

bin/devでrails sを起動するとbinding.pryなどの標準入力が見えなくなる

# Rails 7でbin/devでデバッグ時の問題と対処法

Rails 7系でbin/devを使用してサーバーを起動している際に、binding.pryやdebugを利用すると、プロンプトに入力した文字が表示されない問題があります。
具体的には、コードにbinding.pryを挿入しても、入力した文字が見えず、入力が空白のように見えます。

この問題の原因は、Rails 7でbin/devによって使用されているForemanが標準入力を適切にハンドリングできないためです。

## 現状の対処法
### pry-remoteの使用

– Gemfileにgem ‘pry-remote’を追加し、bundle installを実行します。
– binding.pryの代わりに、binding.remote_pryをコードに挿入します。
– 別のターミナルから$ pry-remoteを実行すると、そのターミナルでデバッグが可能になります。

**デメリット**:多くのターミナルを開く必要があり、手間がかかる。

### ForemanとRailsサーバーを別々に実行

bin/dev

元記事を表示

[Rails]enumについて改めて整理

## モデルのenumについて
:::note
そもそも**enum**とは

**enumとは、1つのカラムに指定した複数個の定数を保存できる様にする為のモノ**
:::

– 指定した複数個の定数以外の値は保存できない
– カラムに指定した定数が入っているレコードを取り出すのが容易に
– データベースには整数値として保存
– アプリケーション内ではシンボルや文字列として扱われる
– 状態に応じたメソッドを自動生成してくれる

### enumを使用すると嬉しいこと
##### コードの可読性と意図の明確化
enumを使うことで、状態やオプションを整数値ではなく、意味のある名前(シンボルや文字列)で表現できます。これにより、コードの可読性が向上し、他のエンジニアがコードを理解しやすくなります。

##### エラーの減少
整数値を直接使用する代わりにenumを使うことで、誤った値を割り当てるリスクを減らすことができます。これにより、データの整合性を維持しやすくなります。

##### メソッドの自動生成
Railsのenumは、状態に応じたメソッド(login?, logout!など

元記事を表示

大規模 Rails で役立つテクニック: コード品質の担保

# はじめに

先日、LTイベント「Qiita Night~Rails~」にて登壇させていただきました。

https://increments.connpass.com/event/297116/

そこで、Railsで大規模Webアプリケーションを 開発するときに知っておきたいテクニックを Qiita の Rails を例にいくつか紹介しました。発表資料はこちらです。

アーカイブ動画もあります。