- 1. 【Ruby on Rails】マイグレーションの仕組みを理解して「分からない」から抜け出そう?【初心者向け】
- 2. 【Rails7/ActionCable】「ArgumentError – wrong number of arguments (given 1, expected 2)」に対するエラー対処(備忘録)
- 3. 注文ステータス enum日本語での実装
- 4. Restful APIとGraphQLの違い
- 5. 管理者側 注文内容一覧ページ
- 6. letter_opener_webって?
- 7. BigDecimal型のデフォルト四捨五入を変更する方法
- 8. 【Rails7】renderメソッド注意点【エラーハンドリング】
- 9. マイページを編集するときにパスワードなしで編集可能にする
- 10. アクション間で同じインスタンス変数を使い回す方法
- 11. Ubuntuでdocker-compose
- 12. 【Rails】バリデーションをスキップ
- 13. 【Rails】メモ化
- 14. 【Rails】DRYなコード
- 15. Railsにてfind, find_by, whereの違いについて
- 16. ジャンル登録機能実装
- 17. EC2上にRails + Selenium + Chromeの実行環境を構築する
- 18. rails sでPostgreSQLが実行できないエラー
- 19. 現在のブランチを保留にして新たなブランチで作業をしたい[stash]
- 20. 作業ブランチを最新にする手順
【Ruby on Rails】マイグレーションの仕組みを理解して「分からない」から抜け出そう?【初心者向け】
# ? はじめに
記事を開いていただきありがとうございます!
この記事では主にRailsの初学者に向けて、マイグレーションの仕組みについて分かりやすく解説します!私が初学の時にやっていた、 **「とりあえず何か分からないけど `rails db:migrate` や `rails db:rollback` を実行してみる」** がみなさんから無くなるように、仕組みを理解できるように、順を追って説明していきます!
:::note info
この記事で書く事
・ よく聞くマイグレーションとはそもそも何か
・ `rails db:migrate` や `rails db:rollback` って何してるの?
::::::note alert
この記事で書かない事
・ SQLの解説
・ データベースの構造
・ Railsのコードの書き方
:::# ? データベースの作り方
まずそもそもデータベース(RDB)はどうやって作るのでしょう?
データベースは `MySQL` や `PostgreSQL` といったデータベースエンジンと呼ばれるものに、 **「データベースを作るよ」** や
【Rails7/ActionCable】「ArgumentError – wrong number of arguments (given 1, expected 2)」に対するエラー対処(備忘録)
# 開発環境
– Ruby 3.2.2
– Ruby on Rails 7.0.6
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117662/0c35f0b8-d878-485c-57c2-6468f7d40c17.png)# エラー内容
ActionCableを用いたチャット機能を実装しようと、以下の実装の手順を書いてくれている記事を参考に進めていたのですが、テキストを送信しても実行されずサーバーログを確認してみると、
**`「ArgumentError – wrong number of arguments (given 1, expected 2)」`**
となっており、直訳すると「2つの引数が渡されるのを期待しているが、1つの引数しか渡されていない」というエラーが発生していました。
そこでエラー箇所を確認してみるも以下のように`ActionCable.server.broadcast`には、`room_channel`と`message: data[‘messa
注文ステータス enum日本語での実装
:cherry_blossom: **はじめに**
bootstrap導入済
namespases使用
devaice導入済
ordersモデル 実装済
admin/orders_controller 作成済
注文機能作成済
public/orders_controller.rb 作成済
“`public/orders_controller.rb
def create
@order = Order.new(order_params)
@order.customer_id = current_customer.id
@order.order_status = 0
@order.savecurrent_customer.cart_items.each do |cart_item|
@order_datail = OrderDatail.new
@order_datail.order_id = @order.id
@order_datail.item_id = cart_item.item_id
Restful APIとGraphQLの違い
## 簡単に言うと
### Restful API
– `URLを使ってデータを取得したり操作したりする`
– リクエストの種類(GETやPOSTなど)によって、データの取得や追加・更新・削除などが行われます。
– シンプルな構造で理解しやすく、使いやすい特徴があります。### GraphQL
– `クエリを使ってデータを取得したり操作したりします。`
– GraphQLもWebサーバーとクライアントの間でデータをやり取りする方法の一つです。
– GraphQLでは、クエリ(Query)という特別な形式でデータを要求します。
– クライアントが必要なデータだけをリクエストできるため、必要な情報だけを効率的に取得できます。
– データの取得や更新の方法が自由で、柔軟性が高い特徴があります。
管理者側 注文内容一覧ページ
はじめに
bootstrap導入済
namespases使用
devaice導入済
costomersモデル、ordersモデル 実装済
注文機能実装済
_____
:star:gimfailにenum導入して日本語で表記されるようにする
“`diff_ruby
gem ‘rails-i18n’
gem ‘enum_help’
“`
“`
$ bundal install
“`
“`scheme.rb
create_table “cart_items”, force: :cascade do |t|
t.integer “customer_id”, null: false
t.integer “item_id”, null: false
t.integer “quantity”, null: false
t.datetime “created_at”, precision: 6, null: false
t.datetime “updated_at”, precision: 6, null: false
t.integer
letter_opener_webって?
# letter_opener_webってなに??
タイトルの通り`letter_opener_web`について解説したいとおもいます。
#### letter_opener_webとは
開発環境でメールを送信した際に、ブラウザでそのメールを確認するためのツールです。
本番環境で実際にメールを送る代わりに、このツールを使ってメールの内容や送信先を確認することができます。
#### 使用方法
Gemfileにletter_opener_webを追加
“`ruby:Gemfile
gem ‘letter_opener_web’, ‘~> 1.0’
“`
“`
$ bundle install
“`
これで使えるようになります!
BigDecimal型のデフォルト四捨五入を変更する方法
# 書き方
書き方は単純なのですが、調べても全然出てこなかった!!
“`models/Hoge.rb
class Hoge < ApplicationRecord BigDecimal.mode(BigDecimal::ROUND_MODE, BigDecimal::ROUND_DOWN) belongs_to :foobar end ``` https://docs.ruby-lang.org/ja/latest/method/BigDecimal/s/mode.html # 例外処理 計算結果が非数(NaN)やゼロによる除算になったときの処理を定義することができます。 ``` flag = false # デフォルト値 f = BigDecimal::mode(BigDecimal::EXCEPTION_NaN,flag) f = BigDecimal::mode(BigDecimal::EXCEPTION_INFINITY,flag) f = BigDecimal::mode(BigDecimal::EXCEPTION_UNDERFLOW,flag) f = Big
【Rails7】renderメソッド注意点【エラーハンドリング】
Railsガイド
https://railsguides.jp/v7.0/layouts_and_rendering.html## 結論から
エラーハンドリングをしたい場合
render :edit, status: :unprocessable_entity
この後半部分が必要です。※Rails7で仕様が変わっています。
以前はデフォルトでバリデーションエラーが発生した場合、自動的にこのステータスコードが設定されていました。
よって:unprocessable_entityを明示的に指定する必要はありませんでした。## status: :unprocessable_entityとは
HTTPステータスコードの一つで、422 Unprocessable Entityを表します。このステータスコードは、リクエストがサーバーに到達したが、サーバーがリクエストを理解できない場合に使用されます。
一般的に、クライアントが送信したデータが不正な場合や、バリデーションエラーが発生した場合にこのステータスコードが利用されます。
## 記載しないとどうなるのか
バリデーションエ
マイページを編集するときにパスワードなしで編集可能にする
## はじめに
初めまして、プログラミングスクールGeekSalonのWebコースメンターをしています。今回の記事は、ユーザーマイページ(プロフィールページ)を編集する際にパスワードを入力せずに編集を可能にする方法をお教えします。
## 前提
・Railsバージョン: 5.0以上
・Deviseバージョン: 4.2以上
・ログインページが実装されている
・ユーザーマイページ(プロフィールページ)が実装されていることDeviseでは、アカウントをアップデートする際に、3つのパスワード情報が必要になります。
**password**
**password_confirmation**
**current_password**パスワードを3回も打つ理由としては、**パスワードの誤入力を防止、不正なアクセスを防止**などが挙げられます。ただ、プロフィールを編集するために、パスワードを3つも入力させるのは、マジで面倒です。
なので、パスワードなしで実装する方法をこの記事のゴールとします。
## 1.RegistrationsControllerの作成
“`
ra
アクション間で同じインスタンス変数を使い回す方法
## 本記事の内容
アクション間で同じインスタンスを使いたいことがありました。
今回は、アクション間で同じインスタンス変数を使い回す方法を解説しています。## 要件
1.ユーザー登録画面では、ユーザー名とメールアドレスのみを入力
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985135/e6e21e29-2e65-b582-a161-6ad67ae24eac.png)2.入力されたメールアドレス宛に確認コードを送信、ユーザーが確認コードを入力する
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985135/a0f7edb8-af25-2681-b832-f51a94625c00.png)このように、「ユーザー名・メールアドレス・確認コード」の3つを同じFormオブジェクトで管理しているが、別々のviewでそれぞれ入力したい場合があります。
この時、ユーザー登録画面から確認コード入力画面
Ubuntuでdocker-compose
rails7 Ubuntuを使っています。
Gemfile
“`
gem “rails”, “~> 7.0.6”
“`Dockerfile
“`
FROM ruby:3.1
# 公式→https://hub.docker.com/_/ruby# Rails 7ではWebpackerが標準では組み込まれなくなったので、yarnやnodejsのインストールが不要
# ruby3.1のイメージがBundler version 2.3.7で失敗するので、gemのバージョンを追記
ARG RUBYGEMS_VERSION=3.3.20# RUN:任意のコマンド実行
RUN mkdir /myapp# WORKDIR:作業ディレクトリを指定
WORKDIR /myapp# COPY:コピー元とコピー先を指定
# ローカルのGemfileをコンテナ内の/app/Gemfileに
COPY Gemfile /myapp/GemfileCOPY Gemfile.lock /myapp/Gemfile.lock
# RubyGemsをアップデート
RUN gem upd
【Rails】バリデーションをスキップ
# validate: false
– https://railsguides.jp/active_record_validations.html
>saveにvalidate: falseを引数として与えると、saveのバリデーションをスキップすることが可能です。この手法は十分注意して使う必要があります。
save(validate: false)– こんな時に使用
– データパッチをする必要があるが、バリデーションが走り登録できない
– 仕様上、Modelに定義したバリデーションは変更したくない
“`sample.rb
ActiveRecord::Base.transaction do
# 更新
contract.assign_attributes(contract_kind: MONTHLY, updated_system: SYSTEM_NAME, updated_user: UPDATED_USER)
contract.save!(validate: false)
end
“`
【Rails】メモ化
– 一度呼び出されてから結果が変わらないものはメモ化してしまう
– 呼び出されるたびにロジックやSQLが実行されるのを防ぐため、実行結果を丸々キャッシュする“`sample1.rb
def position_chief?
@position_chief ||=
if registration_date.nil?
false
else
position = member.position
position.present? && position.chief?
end
end
“`“`sample2.rb
def invoice?
@invoice ||= payment_date >= Date.new(2023, 10, 1)
end
“``||=`により
– **nil** または**false**であれば、右辺を代入する。
– **nil** または**false**以外であれば、2回目以降の呼び出し時は変数に格納された値を実行する。:::note
メモ化によって再実行を避けることが
【Rails】DRYなコード
# DRY原則-二重化の過ち
`DRY原則`(**Don’t Repeat Yourself** = 繰り返しを避けること):::note
システム内の二重化を最小限に抑えることを目的としている
::::::note warn
DRY原則を破るということは、同じ知識を2箇所以上に記述すること。
この場合、片方を変更するのであれば、もう片方も変更しなければいけなくなる。
:::開発自体の理解とメンテナンスを容易にする唯一の方法は、DRY原則に従うこと。
「すべての知識はシステム内において単一、かつ明確な、そして信頼できる表現になっていなければならない」:::note
既にあるものを簡単に見つけ出して再利用できるようにし、同じものを何度も作成しないような環境を構築すること
:::# 重複しているクエリを修正する
## 最後の条件だけ違うパターン
“`共通コード.rb
transaction_arel = Transaction.arel_table
credit_arel = Credit.arel_table
shop_arel
Railsにてfind, find_by, whereの違いについて
## はじめに
Railsでモデルの検索に使えるメソッド`find, find_by, where`の使い方や違いについて紹介します。
## 結論
||find|find_by|where|
|————|———|———|————|
|括弧の中に指定するものは?|id(複数可能)|条件|条件
|戻り値|条件に一致するデータ全て|条件に一致する最初の1件だけ|条件に一致するデータ全て
|戻り値の型|モデルのインスタンス (結果が複数の場合は配列)|モデルのインスタンス|`ActiveRecord::Relation`のインスタンス
|検索結果がない場合|例外発生|`nil`を返す|空きの`ActiveRecord::Relation`を返す
## 動作確認
### テストデータ
“`
irb(main):015:0> Word.all
Word Load (4.5ms) SELECT `words`.* FROM `words`
=>
[#
ジャンル登録機能実装
はじめに
bootstrap導入済
namespases使用
devaice導入済
itemモデル genleモデル 作成済
商品登録ページ作成済
________
完成イメージ
ジャンル一覧・ジャンル登録(indexページ)
![スクリーンショット 2023-07-23 13.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/f4691ccf-e93e-3ec9-e91e-32c068552689.png)
ジャンル更新ページ(edit)
![スクリーンショット 2023-07-23 13.49.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3492906/46847e7e-69ab-a644-7453-7046e766c7cf.png)### モデル設定
ジャンルモデル追加
“`
$ rails g model Genre name:string
$ rails db:migra
EC2上にRails + Selenium + Chromeの実行環境を構築する
# 前提
– AWS EC2 : Amazon Linux 2023 AMI 2023.1.20230719.0 x86_64 HVM kernel-6.1
– このAMIじゃないとこの後実行する行うコマンドで、Google Chromeがダウンロードできない可能性があるので注意。
– Ruby : v3.2.0
– Ruby on Rails : v7.0.5
– bundler : v2.4.12
– Node : v16.20.0Ruby on Railsが実行できる環境はすでに構築しているものとします。
`Webdrivers::Chromedriver.required_version = “114.0.5735.90”`というのを指定すると、Webdriverで自動的にChromeDriverをインストールして、それを勝手に利用するようになっていました!
以前までは`brew install chromedriver`を実行してChromeDriverをダウンロードして実行していましたが、その必要もなくなったようです。
# 環境構築
環境構築する上
rails sでPostgreSQLが実行できないエラー
# 1.現状
ローカルでアプリケーションを実行しようとしたところ、以下のエラーがでました。
“`
ActiveRecord::ConnectionNotEstablished (connection to server on socket “/tmp/.s.PGSQL.5432” failed: No such file or directory
Is the server running locally and accepting connections on that socket?翻訳
ActiveRecord::ConnectionNotsteaded (ソケット「/tmp/.s.PGSQL.5432」上のサーバーへの接続に失敗しました: そのようなファイルまたはディレクトリはありません)
サーバーはローカルで実行されており、そのソケットでの接続を受け入れていますか?
“`# 2.直近で行った変更
AWS-s3の導入を行いました。# 3.エラー文から考えられる原因
postgresqlが立ち上がっていないことが原因と予測しました。# 4.解決のために行った
現在のブランチを保留にして新たなブランチで作業をしたい[stash]
# 1.はじめに
作業中に別ブランチを切って作業したいときに`stash`を使用して現在のブランチでの変更を退避させることができます。
退避した変更をもとに戻して作業を再開することも可能です。# 2.stashコマンド一覧
### 1.作業を退避させる
以下コマンドでメッセージをつけて変更を退避させることができます。
あとからみたときにわかりやすいメッセージをつけておくことをおすすめします。
“`
$ git stash save “メッセージ”このコマンドを使うと未追跡のファイルも退避できる。
$ git stash save -u “メッセージ”
“`### 2.退避した作業の一覧を表示させる
“`
$ git stash list
“`### 3.退避した作業を戻す
“`
$ git stash apply stash@{0}
“`### 4.退避した作業を消す
“`
$ git stash drop stash@{0}
“`### 5.退避した作業の詳細を確認する
“`
$ git stash show stash@{0}
“`
以下
作業ブランチを最新にする手順
### 1. masterブランチへ移動
“`
git checkout master
“`### 2. masterを最新に更新
“`
git pull origin master
“`### 3. 開発用のブランチへ移動
“`
git checkout 開発用ブランチ名
“`### 4. masterの内容を取り込む
“`
git merge master
“`### 5. 取り込んだものをリモートにpush
“`
git push origin 開発用ブランチ名
“`