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

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

【Ruby】RubyのStructを活用する

# 1. Struct
RubyにはStructという、構造体を扱うクラスがあります。

:::note info
構造体とは?
構造体とは「1つ以上の、任意の種類の値をまとめて1つにしたもの」である。

データや情報、プログラムのコードなどを意味のある単位に分類・分割・整理して、構造的にまとめることが目的。

無秩序なデータをオブジェクト指向的に記載できるので最高。
:::

## TL;DR
– シンプルなデータ構造や一時的なデータのカプセル化
– 構造や目的がはっきりしているが、完全なクラスを定義するほどではない場合
– 責務が複数存在するモデルを分割するための最初のステップ
– Hashでサイレントエラーが起きてしまった場合(Structで属性間違えたらエラーが出る)
– Structは「一時的なデータのカプセル化」であり、ここでの「一時的」の定義は、主にプログラムのスコープやライフサイクルの短さを指す

# 2. Structの基本的な定義・振る舞い
– 任意のパラメーター、メソッドを定義できる構造体クラス
– 配列やHashのようにアクセスでき、型変換も可能
– 属性を

元記事を表示

投稿機能アプリの削除機能

備忘録としてあげさせていただきました。

## 目的
– CRUDのD(DELETE)を体験
– データの操作で基本的な処理となる「削除」を理解
– destroyアクションを理解
– Prefix

## 削除機能
7つのアクションのうち、削除機能はdestroyが該当

## 実装の流れ
1. ツイートを削除するためのルーティングを設定 
1. 削除ボタンをビューに追加
1. destroyアクションをコントローラーに定義する

## destroyアクションのルーティング設定
config/routes.rb
“`ruby
resources :tweets, only: [:index, :new, :create, :destroy]
“`

## 削除ボタンを投稿一覧に追加
`linl_to`mメソッドを使い、削除ボタンを追加
削除ボタンのパスには **_ツイートのid_**を パラメーターとして持たせる
/tweets/《tweetのid》というパスにすると、パラメーターとして受け取ることができる

HTTP: **_DELETE_** メソッド

元記事を表示

【Rails】enum 使う時はprefixを使いましょう

# はじめに
`enum`を使う時は`prefix`を使いましょう、という提案です。

# なぜ_prefixを使うと良いのか

**1.可読性が上がる**、**2.拡張性が高くなる**からです。

## 可読性が上がる
“`ruby
class Article < ApplicationRecord belongs_to :user enum :status, { unsaved: 10, draft: 20, published: 30 }, _prefix: status end ``` `_prefix`がない場合も一見わかりやすいですが、個人的には`_prefix`を付与することで、`モデル`の`このカラム`の`このステータスの状況`が一目でわかりやすくなります。 ```ruby:_prefixがない場合 [3] pry(main)> article.published?
=> true
[4] pry(main)> article.draft?
=> false
[5] pry(main)> article.unsaved?
=> false
“`

“`ru

元記事を表示

【kaminari】Rails APIで全体のページ数をレスポンスで返したい

# はじめに
`Rails API`と`kaminari`使用時に**全体のページ数**を取得してレスポンスしたかったので、その方法についてまとめます。

# 手順
再利用できるよう、consernsにモジュールとして切り出しておきます。
`kaminari`では、`Article.page(1).total_pages`のように`total_pages`を使うことで全体のページ数を取得することができます。

“`ruby:app/controllers/concerns/pagination.rb
module Pagination
extend ActiveSupport::Concern

def pagination(records)
{
total_pages: records.total_pages # 全体のページ数
}
end
end
“`

`meta: pagination(articles)`で`pagination`を呼び出し、`meta`キーを配下として値を時データを参照ができ、最終的に`adapter: :json

元記事を表示

サンプルコードでわかる!Ruby 3.3の主な新機能と変更点

## はじめに

Rubyは毎年12月25日にアップデートされます。
Ruby 3.3は2023年12月25日に正式リリースされる予定です。
本記事の執筆時点ではrc1がリリースされています。

https://www.ruby-lang.org/ja/news/2023/12/11/ruby-3-3-0-rc1-released/

この記事ではRuby 3.3で導入される変更点や新機能について、サンプルコード付きでできるだけわかりやすく紹介していきます。

ただし、すべての変更点を網羅しているわけではありません。個人的に「Railsアプリケーションの開発時に役立ちそうだな」と思った内容をピックアップしています。本記事で紹介していない変更点も多数ありますので、以下のような情報源もぜひチェックしてみてください。

https://www.ruby-lang.org/ja/news/2023/12/11/ruby-3-3-0-rc1-released/

https://github.com/ruby/ruby/blob/v3_3_0_rc1/NEWS.md

### 動作確認したRub

元記事を表示

RailsでURL短縮サービスをつくってみる

# 概要
### どのようなサービスか
長いURLを短いURLに変換するサービスです。
有名どころで言うと[bitly](https://bitly.com/)ですね。
試しに、Wikipediaの長いURLを変換してみます
長いURL:https://ja.wikipedia.org/wiki/1-%E3%83%94%E3%83%AD%E3%83%AA%E3%83%B3-4-%E3%83%92%E3%83%89%E3%83%AD%E3%82%AD%E3%82%B7-2-%E3%82%AB%E3%83%AB%E3%83%9C%E3%83%B3%E9%85%B8%E3%83%87%E3%82%A2%E3%83%9F%E3%83%8A%E3%83%BC%E3%82%BC
短いURL:https://bit.ly/49UA01h
どちらも同じページへ遷移することが確認できます。

### 短縮方法
URL短縮用のGemもありますが、今回は使用せずにハッシュ変換+衝突判定で開発します。

### リポジトリ
コードを確認したい方は以下へ

https://github.com/kakeruAo

元記事を表示

ActiveRecordのjoins, eager_load, preloadで一生迷うのでフローチャートにした

# はじめに
メリークリスマス!ZOZOの@sasamukuです。

昨年は開発未経験の SRE がバックエンドエンジニアに転籍した話を書きました。

https://qiita.com/sasamuku/items/3f92d7f4edd74ca1b71f

転籍から1年経過し Ruby on Rails での開発にも慣れてきました。

しかし未だに迷うことがあります。それは `joins (left_joins)`, `eager_load`, `preload` の使い分けです。忘れてはググる日々に終止符を打つべく YES or NO 形式のフローチャートにしました。

本記事ではフローチャートの設問に基づきながら、各メソッドを利用すべきケースとその特性について説明していきます。

# フローチャート
フローチャートはこちらになります。

active_record_flowchart.jpg【Rails6】Action Text × Bootstrap(4系) Webpacker管理だと相性悪すぎる件

## はじめに
こんにちは!

**DMM WEBCAMP Advent Calendar 2023** :christmas_tree: **24日目**も、同じく @Keichan_15 が担当させて頂きます!:v:

今回はやはり普段Railsをお教えしている身として、ちゃんとRailsに関する記事を書こうかなと…:thinking:

ところで、皆さんは **Action Text** と呼ばれるRails6から追加された新機能についてご存じでしょうか。
Action Textは**リッチテキストを編集するための便利なエディター** で、通常よりもモダンなフォームを作成することができるエディターです。

こんな感じのヤツ ↓

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2798073/ae8991fc-fc89-96e0-5717-02aace3b82bf.png)

とても便利な機能なのですが、実はWebpacker側でB

元記事を表示

Ruby on Railsを触ってみた

# はじめに

この記事は、Qiita Advent Calendar 22日目の記事です。
以下の記事より、すべての記事をご覧になれます。

https://qiita.com/0_terarin_0/items/0f367210e2465f7772c9

# 筆者について

– 現在高校2年生
– 水泳部マネージャー
– 生徒会長
– とある団体の代表

# 本編

僕自身普段からRubyを触ることは全くないんですが、これを機会に触ってみることにしました。

https://guides.rubyonrails.org/getting_started.html

## ①インストール

“`zsh:shell
ruby –version
#ruby 3.2.2 (2023-03-30 revision e51014f9c0) [arm64-darwin23]

gem install rails
“`

さて、「よし、これでやっと触れる!」と思ってみたのですが…。

“`shell:zsh
rails
#Rails is not currently installed on

元記事を表示

Rails7系から追加された便利そうなメソッド

# はじめに
Railsの7系を触っていてあまり見慣れないメソッドに出会う機会が多いので、改めてまとめてみました。

# sole
https://railsdoc.com/page/sole

“`ruby
# Userモデルに対して、usernameが特定の値であるレコードを取得しようとする。
# usernameがユニークであることが期待されている場合に使用する。

begin
user = User.where(username: ‘unique_username’).sole
puts user.name
rescue ActiveRecord::RecordNotFound
# レコードが見つからなかった場合の処理
puts ‘ユーザーが見つかりませんでした。’
rescue ActiveRecord::SoleRecordExceeded
# 複数のレコードが見つかった場合の処理
puts ‘期待されるユーザーが複数存在します。’
end
“`

# excluding
https://railsdoc.com/page/excluding

元記事を表示

paramsで配列形式のデータを受け取るには?

### はじめに
Railsで配列形式のデータ(例えば、tag_ids)をフォームから受け取る方法についての記事です。
具体的なパラメータ構造を以下に示します。

“`terminal:
params =>
{
“article”=>
{
“title”=>”title”,
“tag_ids”=>[“1″,”2”]
}
}
“`
本記事では、tag_idsが配列としてどのようにフォームから受け取られるかを解説します。

### 動作環境
ruby : 3.1.4
rails : 7.0.8

### どういうケースを想定している?
今回は、多対多の関係を持つテーブルを想定しています。
例としては、以下ER図にあるように、記事(Article)とタグ(Tag)に対して中間テーブル(ArticleTags)が存在しているケースです。

“`mermaid
%%{init:{‘theme’:’forest’}}%%
erDiagram
articles ||–o{ article_tags : “”
tags ||-

元記事を表示

開発環境の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が多対多の

元記事を表示

OTHERカテゴリの最新記事