Rails関連のことを調べてみた2023年01月04日

Rails関連のことを調べてみた2023年01月04日
目次

Rails 7.0にバージョンアップしたらquery_log_tagsを有効化しよう

# Profit
– verbose_query_logs = true でない環境でrails serverのログが少し追いやすくなる
– ActiveJobを使っている場合はジョブのログも
– スロークエリログの発生箇所が少し特定しやすくなる

# How to
Railsアプリケーションの設定に以下を追加するだけ

“`rb
config.active_record.query_log_tags_enabled = true

# カスタマイズする場合は `query_log_tags=` を使って指定可能
config.active_record.query_log_tags = [ :controller, :action ]
“`

# 前提知識
## Verbose Query Logsについて
Railsアプリケーションを開発していてふとログを見た時に、SQLログのすぐ下にソースコードのどの行で呼ばれたのかが出力されている (下記参照) のが地味に便利だったりする。
“`
Article Load (0.2ms) SELECT “articles”

元記事を表示

ShopifyAPI::Auth::Oauth::AuthQueryでwrong number of arguments (given 1, expected 0)が出る場合(Rails7 + Ruby3.0以上)

Shopifyの公式gemを使っていて発生したエラーに対する対処法。
(Rails7, Ruby3.0以上で多分発生)

filtered_params = request.parameters.symbolize_keys.slice(:code, :shop, :timestamp, :state, :host, :hmac)
keyword_params = Hash.ruby2_keywords_hash(filtered_params)
auth_query = ShopifyAPI::Auth::Oauth::AuthQuery.new(keyword_params)

auth_result = ShopifyAPI::Auth::Oauth.validate_auth_callback(
cookies: cookies.to_h,
auth_query: auth_query
)

キーワード引数の挙動の変更によるものと思います。

元記事を表示

uninitialized constant ◯◯[定数名] (NameError)への対処法

# 概要

PF作成中にdockerでサーバーの起動を試みた際、
uninitialized constant OmniAuth (NameError)というエラーが表示。
つまづいたので記録として残します。

# 対処法

①以下項目を確認
・ファイル名とclass名が一致しているか?
・ファイルpathとmoduleの定義が一致しているか?
・Railsにファイルを読み込ませているか?
(引用元と詳細:https://qiita.com/yoshixj/items/17de45928f52264fd6a0)

②サーバー起動時に問題が発生した場合は、当該定数のGemがインストールされているか確認

以上です。

# ちなみに
私は②でした。
そもそもGemfileにomniauth-twitter(定数OmniAuthを使うためのGem)を記載していませんでした。

ミスは大体単純な所で発生しがち、気をつけます。

元記事を表示

開発をはじめて半年の私がデータの並び替えで使えるなぁと思ったもの

開発業務に携わって半年、
データの並び替えで使えるなぁと思ったものを2つ書き留めておきます。

開発環境
・Ruby
・Rails
・MySQL
・Mac

なお、この記事で「order」とは、「取得したレコードを特定のキーで並び替える」ことを指します。
[参考] https://railsdoc.com/page/model_order

#### 今回使うテーブル
Naoさん、Kenさん、Mikaさんのやることリストテーブルを仮定します。
contentはやることリストの内容、personは人、categoryは項目のカテゴリー、dateは日付を格納する想定です。

“`
+—-+————+——–+————–+————+
| id | content | person | category         | date |
+—-+————+——–+————–+————+
| 1 | 女子会 | Nao | frie

元記事を表示

【Rails】SNS機能で相互フォロー一覧を取得する

フォロー一覧、フォロワー一覧を実装する記事はよく見かけるのですが、相互フォロー一覧を取得する実装は見かけなかったので、今回記事にしました。

## 前提
基本的なフォロー・フォロワー機能がすでに実装してあることが前提となります。
具体的には以下のような実装を前提としています。

## モデル

“`ruby: user.rb
class User < ApplicationRecord has_many :relationships, class_name: 'Relationship', foreign_key: 'follower_id', dependent: :destroy, inverse_of: :follower has_many :reverse_of_relationships, class_name: 'Relationship',

元記事を表示

Turbo Rails Tutorial をやってみた! 0章(Mac、Ruby 3.2.0、Rails 7.0.4)

本記事は、?「Turbo Rails Tutorial」の学習を進めていく際の個人メモです!

https://www.hotrails.dev/turbo-rails

# 0章 [Turbo Rails tutorial introduction](https://www.hotrails.dev/turbo-rails/turbo-rails-tutorial-introduction)

この章では、環境構築をしていきます。ちなみに私は Mac ローカルで進めます。最新の ruby で進めたかったので ruby 3.2.0 をインストールしました。

“`terminal
$ brew update
$ brew upgrade ruby-build
$ rbenv install 3.2.0
“`

インストール時に下記と同じエラーが出ました。

https://github.com/rbenv/ruby-build/discussions/2118

ruby 3.2.0では、`libyaml`や`libffi`を別途インストールする必要があるそうです。

“`te

元記事を表示

バリデーションを始めて扱う

# バリデーション(検証)
Active Recordを使って、モデルがデータベースに“`書き込まれる前にモデルの状態をバリデーション(検証: validation)“`できます。Active Recordにはモデルチェック用のさまざまなメソッドが用意されており、属性が空でないかどうか、属性が一意かどうか、既にデータベースにないかどうか、特定のフォーマットに沿っているかどうか、多岐にわたったバリデーションが行えます。

バリデーションは、“`データベースを永続化するうえで極めて重要“`です。そのため、save、updateメソッドは、バリデーションに失敗するとfalseを返します。このとき実際のデータベース操作は行われません。上のメソッドにはそれぞれ“`破壊的なバージョン (save!、update!) があり、こちらは検証に失敗した場合にさらに厳しい対応“`、つまりActiveRecord::RecordInvalid例外を発生します。以下はバリデーションの簡単な例です。

“`rb
class User < ApplicationRecord validates

元記事を表示

【Rails】エラー Mysql2::Error: Table ‘〇〇_development.〇〇’ doesn’t exist: 

# 概要
アプリ作成時、コントローラ、モデルを一気に作成し、その後
“`$ rails db:migrate“` コマンド実行でタイトルのエラー。
解決方法をまとめます。

# 結果
“`rails db:migrate:status“` でdown状態を確認後、
マイグレーションファイルの日時部分を入れ替え、
“`$ rails db:migrate “`で解決。

![スクリーンショット 2023-01-03 16.55.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2235743/b5c32f8d-ec10-0936-ded1-d90ae7ebb106.png)

青丸の部分を入れ替えます。

# 原因
外部キー、モデル作成($rails g コマンド)の実行順番が原因でした。

以下、画像のcommunity_topic、article、community_topic_tagテーブルで解説します。
![スクリーンショット 2023-01-03 16.42.12.png](ht

元記事を表示

AWS内のDBを dbeaver に表示させる

## 概要

AWS(EC2 ,RDS CLOUD9) + Ruby on Railsでプロジェクト作成した。
AWS内で使用しているDB(Mysql)をWindows(ローカル環境)にインストールした
Dbeaver上でRails プロジェクト(本番環境)のDB(Mysql)を表示させる例を示す

## 前提条件

### 1.開発環境

EC2-インスタンス使用 (Amazon Linux)
-インスタンスid: i-〇〇〇〇〇…
-パブリック IPv4 アドレス:〇〇.〇〇〇.〇〇.〇〇
-Elastic IP: 上記に同じ

統合開発環境 AWS cloud9を使用
DB: sqlite3 (Railsでの標準DB)

### 2.本番環境

EC2-インスタンス使用 (Amazon Linux)
-インスタンスid: i-△△△△…
-EC2ユーザー名: ec2-user(デフォルトのまま :変更可)
-パブリック IPv4 アドレス:△△.△△△.△△.△△
-Elastic IP: 上記に同じ

DB: mysql 使用 (AWS R

元記事を表示

yarn build したときのエラー解決方法(Rails7 アプリで esbuild を使用時)

# エラー内容

以下のようなエラーが出たときの解決方法を記録しておきます。

“`bash
docker-compose run –rm app yarn build

Creating ***_app_run … done
yarn run v1.22.17
$ esbuild app/javascript/*.* –bundle –sourcemap –outdir=app/assets/builds –public-path=app/assets/builds
/myapp/node_modules/esbuild/bin/esbuild:159
throw new Error(`
^

Error:
You installed esbuild for another platform than the one you’re currently using.
This won’t work because esbuild is written with native code and needs to
install a

元記事を表示

ユーザー管理機能(Devise)について

# deviseとは
webアプリケーションにおいて認証機能を実装するためのgemです。

# 導入方法
1\. ターミナルにてcdコマンドを使い、作成しているAppのディレクトリ内に移動する

2\. Gemfile内で追記する
“` .Gemfile
gem ‘devise’
“`

3\.ターミナル内にてGemをインストール
“` .terminal
bundle install
“`
:::note info
gemをインストールした後はローカルサーバーを再起動する
:::

4\.deviseの設定ファイルを作成
“`.terminal
rails g devise:install
“`

# deviseのモデルを作成
1\.モデルの作成
“`.terminal
rails g devise [モデル名]
“`

2\.テーブルに必要なカラムを追加
モデルを作成するとdb/migrateのディレクト内に先程生成したdeviseのモデルテーブルが生成されている。そのファイル内で追加を行う

:::note info
ex)nicknameを文字列型、空なしにす

元記事を表示

git mergeしたらnot something we can mergeが出たので解決してみた

今回はgit mergeを実行しようとした以下のエラーが発生した

“`
merge: sigh-up – not something we can merge
“`

解決策

ブランチ名をコピペしたらいけた。

ブランチを確認して、マージしたいブランチ名をここでコピーします。
“`git
git branch
filling-in-layout
* main
modeling-users
rails-flavored-ruby
sign-up
static-pages
“`

コピーしたマージ名をペーストしてあげると解決できました。
“`
git merge <マージ名> #マージ名を入力するときだけペーストする。
“`

考えられる原因

おそらくタイプミスなのですが、ぱっと見はよくわかりませんでした。なので、この手のエラーが出たらとりあえずブランチ名をコピペしてみるといいかもしれないです。

元記事を表示

redirect_to @userは redirect_to user_url(@user)と同値

以下の二つのコードは同値です。
“`Ruby
redirect_to @user
“`

“`Ruby
redirect_to user_url(@user)
“`

元記事を表示

投稿のコメントにYoutubeのURLを入れ込む方法

今回はユーザーが投稿した投稿にコメントをする際にYoutubeのURLを埋め込む方法を紹介します。

投稿のコントローラー:favorite(普段自分が使っているコントローラー)
コメントのコントローラー:comment

①commentsテーブルにyoutube_urlカラムを追加します。

“`ruby:コマンドプロンプト
rails generate migration AddYoutube_urlToComments youtube_url:string
“`
“`ruby:コマンドプロンプト
rails db:migrate
“`

②commentコントローラーに、コメント内でYoutubeのURLを埋め込むためのコードを書きます。

“`ruby:app/controller/comments_controller.rb
def create
favorite = Favorite.find(params[:favorite_id])
comment = favorite.comments.build(comment_params)

元記事を表示

【Rails で論理削除】paranoid | paranoia を使わないで discard gem を使う理由

# 【Rails で論理削除】paranoid | paranoia を使わないで discard gem を使う理由

## 三行まとめ
“`
User.destroy # 物理削除
Comment.destroy # 論理削除
“`
☝️いやみわけつかん?

## 【悪い点】 paranoid | paranoia は rails の関数をオーバーライドする。

モデル側で`acts_as_paranoid`という指定をすると、destroy が論理削除になる。

“`
class Comment < ApplicationRecord acts_as_paranoid end ``` ## paranoid | paranoia のメリデメ ### メリット 物理削除の時と名前が同じなので覚えやすい ### デメリット 論理削除と物理削除のモデルが混在するとバグ埋め込む可能性が上がる たとえば - User.destroy = 物理削除 - Comment.destroy = 論理削除 という風に物理削除と論理削除を使うモデルが混在している場合が問題

元記事を表示

[ERROR] Could not resolve “@rails/request” を解決する!

# エラー内容

以下のようなエラーが出たときの解決方法を記録しておきます。

“`bash
$ docker-compose run –rm app yarn build
Creating rails7-bramee_app_run … done
yarn run v1.22.17
$ esbuild app/javascript/*.* –bundle –sourcemap –outdir=app/assets/builds –public-path=assets
✘ [ERROR] Could not resolve “@rails/request”

app/javascript/controllers/***_controller.js:
2 │ import { FetchRequest } from “@rails/request”
╵ ~~~~~~~~~~~~~~~~

You can mark the path “@rails/request” as ex

元記事を表示

【Rails】nil? empty? blank? present?の挙動と使い分けを確認

## 1. TL; DR
下記の基準で使い分ける
– nilかどうかの観点のみで判定したい:nil?
– nil + 空のオブジェクトの存在を判定したい:blank?
– 値の有無によって結果を判定したい:empty?
※例外が発生する可能性があるため取り扱い注意
– 空でないオブジェクトの存在を判定したい:present?

#### 早見表
| |nil? |empty?|blank?|present?|
|— |— |— |— |— |
|nil |true |“NoMethodError“|true |false|
|true |false|“NoMethodError“|false|true |
|false |false|“NoMethodError“|true |false|
|”” |false|true |true |false|
|” ” |false|false |true |false|
|[] |false|tru

元記事を表示

【Rails】present?とexists?の挙動を確認し、使い分けの基準を整理する

## 1. present?
– Railsのメソッド
– オブジェクトがある場合はtrueを返す
– present?の反対は、blank?
– 実行するとキャッシュされる

発行されるクエリを見てみると、1回全部の該当レコードをごそっと取ってきていることが分かる
“SELECT “articles”.* FROM “articles” WHERE “articles”.”title” = ? [[“title”, “Test”]]“

“`
irb(main):001:0> Article.where(title: ‘Test’).present?
(1.6ms) SELECT sqlite_version(*)
Article Load (0.2ms) SELECT “articles”.* FROM “articles” WHERE “articles”.”title” = ? [[“title”, “Test”]]
=> true
“`

## 2. exists?
– Railsのメソッド
– SQLのexists式を使う
– 該当レコー

元記事を表示

RSpec MocksのREADMEを翻訳

# 翻訳する目的

[Everyday Rails – RSpecによるRailsテスト入門](https://leanpub.com/everydayrailsrspec-jp)を読み、モック関連と、FactoryBotについて更に知識をつけたいと思いました。どちらも技術本で学ぶのは難しいので、リポジトリのREADMEを通じて学ぶのが良いと考えました。
Google翻訳やDeepLを用いて全文翻訳を行うと、日本語が不自然で読みにくかったので、今後何度も参照することを考えて、自分で翻訳することにしました。
FactoryBotのREADMEの翻訳は既に存在していたので、[RSpec MocksのREADME](https://github.com/rspec/rspec-mocks/blob/main/README.md)を翻訳することにしました。

# 翻訳時のルール

– Google翻訳やDeepLは利用しない。
– わからない単語を辞書で調べるのはOK。

# 翻訳してみてどうだったか?

良い点

– 英語のドキュメントを読む練習になる。
– ドキュメントを細部までしっかり読

元記事を表示

Rails API 論理削除の実装

# はじめに
業務のタスクの中で論理削除を実装するタスクが有りましたので、備忘録として書き起こすことにしました。至らぬ点はご容赦ください。。。

# そもそも論理削除とは?
https://www.tutitatu.com/%E3%80%8C%E8%AB%96%E7%90%86%E5%89%8A%E9%99%A4%E3%80%8D%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%82%84%E6%84%8F%E5%91%B3%E3%80%81%E4%BE%8B%E6%96%87%E3%82%84%E9%A1%9E%E7%BE%A9%E8%AA%9E%E3%82%92%E5%BE%B9/#i-2

↑こちらによると
> データベースのレコードを削除する際にフィールド値を変更する事で削除した扱いにする方式で実際のデータは削除しない事。

とあります。PCの「ゴミ箱」機能がこれにあたるとも書かれていました。
論理削除を実装するメリットとしては、「あたかも削除をしたかのように振る舞う」のでいざ復旧しようとなるとすぐにできることがメリットとして挙げられます。

#

元記事を表示

OTHERカテゴリの最新記事