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

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

Webpacker::Manifest::MissingEntryErrorの解決方法

## 【開発環境】
Ruby 2.7.5
Rails 6.1.7.6

### どういう時にエラーが発生したか
1. Railsで新規アプリケーションを実装した際、users_controller.rbを新規作成
1. indexアクションを定義後、`app > views > index.html.erb`を新規作成
1. rails sコマンドで立ち上げた際に、以下のエラーが作成した。

※以下のようなエラーのキャプチャ
![スクリーンショット 2023-10-02 6.16.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568360/bb86f239-2f7a-660e-b3a2-3533b8a1297a.png)

### エラー解決のためにやったこと
[Webpacker::Manifest::MissingEntryErrorが発生]https://qiita.com/kndknd/items/18187f1c2199651d08d5
上記のサイトでは以下の2コマンドでOKとのこと

元記事を表示

Deviseで複数モデルを使用したログインの実装

## やりたいこと
親ユーザーの認証ではデフォルトのemailとpasswordでの認証を使用してログイン。
子ユーザーの認証では、nicknameとパスワードで登録と認証ができるようにする。
また、子ユーザーを作成できるのは、親ユーザーのみ。
family(親ユーザー)
|colum|validation|
|:–|:–:|
|email|null:false|
|password|null:false|
|family_name|null:false|

user(子ユーザ)
|colum|validation|
|:–|:–:|
|nickname|null:false|
|password|null:false|
|family_id|null:false|

## 手順
#### root用のコントロ3ーラーとビューを作成
“`rails g controller home index“`
“`ruby:home_contoroller.rb
class HomeController < ApplicationController def index e

元記事を表示

【備忘録】Railsのheadメソッドでよく使うステータスコードと対応するシンボル

:::note info
Railsのheadメソッドについて。
headメソッドは、応答ステータスとヘッダのみを出力してくれるメソッド。以下で各ステータスコードごとの意味とシンボルを表で整理しました。
:::

| ステータスコード | HTTP コード | 意味 |
|:—————|:———–|:—–|
| `:ok` | 200 | 成功の意味。主にGETリクエストの成功を示すのに使用されます。 |
| `:created` | 201 | リソースの作成が成功したことを示す。主にPOSTリクエストの成功を示すのに使用されます。 |
| `:accepted` | 202 | リクエストが受け入れられたが、まだ処理されていないことを示す。 |
| `:no_content` | 204 | リクエストは成功したが、返す内容がないことを示す。主にDELETEリクエストや、PUT/PATCHリクエストの成功

元記事を表示

has_many, belongs_toでインスタンスメソッドを定義している件について

# はじめに
初めまして! 
私はRUNTEQでRuby on Railsをメインに勉強しています。
今回は私が関連付け(アソシエーション)の学習の過程で見落としてしまったが故に、後に苦労したことについて記録しておこうと思い、本記事を執筆しています。

# 本題

早速ですが、今回お伝えしたいのは次のようなことになります。

**関連付けの際、has_manyやbelongs_toで指定したものはインスタンスメソッドとして使える。**

例えば、一人のユーザーが複数のポストを投稿できるようにするという状況を仮定します。モデルにはUserとPostがあり、両者を関連付けします。関連付けには色々と手続きが必要ですが、その中でmodelsディレクトリにはこのように書くでしょう。

“`Ruby:app/models/user.rb
has_many :posts, dependent: :destroy
# dependent: :destroyは本記事では重要ではありません。
“`
“`Ruby:app/models/post.rb
belongs_to :user
“`
このとき

元記事を表示

Rubyで使われる%w記法(配列がいっぱいある時にめっちゃ便利!)。知っていたら実務で最強!

# この記事の背景
現場RSpecでテストを実装している時に、テストデータが以下のようになっていました。
(以下のサンプルは例で実際の現場のものではないです)
“`spec.rb
:abc=>[“1900”, “株式会社nori”, “inu town【1900】”, “ロンドン”, “福岡2-9-11”, “カフェ”, “30”, “中村”, “2”, “山口”, “03-4578-5598”, “20221124”, “1689”, “5”],
“`
このような配列がある時に、RuboCop(コード解析ツール)を使用した時に、配列が多すぎる!
と怒られてしまいました。実際人間の目から見ても見づらいです。
***現場では自分がいなくなった後の人がコードを読みやすくしなければいけない***ので
修正する必要が出てきました。

その時に“`%w“`の書き方を学びました。

# %w記法とは
***配列を作成したいときに「[ ]」(ブラケット)や「” “」(ダブルクォーテーション)を省略して記述する***ためのRubyの書き方です。コードの可読性(読みやすくなる)がよくなり、コ

元記事を表示

Rails7 link_toで”turbo-method: :post”を設定しているのにGETのHTTPメソッドとして認識される

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0

## 解決したい内容
* 以下のように`turbo-method: :post`を設定している`link_to`タグにおいて`[POST]`メソッドではなく、`[GET]`メソッド扱いされる。

“`erb
<%= link_to hoge_path(hoge), data: { turbo: false, "turbo-method": :post } %>
“`

“`

Routing Error
No route matches [GET] “/hoge”
“`

## 解決手順
* `turbo: false`と`”turbo-method”: :post`は共存できない。`turbo: false`の記述を削除して、以下のようにすることで解決。
“`erb
<%= link_to hoge_path(hoge), data: { "turbo-method": :post } %>
“`

## 補足
* link_toはデフォルトでは`[

元記事を表示

Rails7 Bootstrap slimのfile_fieldの見た目をアイコンにする

This article shows how to change the appearance of slim’s file_field to Bootstrap icon.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0
* Bootstrap 5.2.3
* テンプレートエンジンとしてslimを使用

## 解決したい内容
* formタグの中のfile_fieldの見た目を以下の①通常の見た目でなく、②アイコンの見た目にしたい

①通常の見た目
![通常のfile_field.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3490253/67393a91-ff95-26cc-0d80-425007138bfd.png)

②アイコンの見た目(画像左のimageアイコンをクリックして画像添付としたい)
![iconに変更したfile_field.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.c

元記事を表示

【Rails】devise-token-authを用いたユーザー登録機能の作成

devise_token_authを用いたログイン機能の実装を備忘録として残します。

・Gemファイルの準備/インストール

Gemfileにdevise_token_authをGemに準備する。
以下の内容をGemfileに記載し、`bundle install`を行う。

“`ruby:Gemfile
gem “rack-cors”
gem ‘devise’
gem ‘devise_token_auth’
gem ‘devise-i18n’
“`

下記の2つのコマンドを実行することで、devise_token_authをインストールする。
“`
rails g devise:install
rails g devise_token_auth:install User auth
“`

・ログイン機能の実装

まずは認証のコントローラーを準備するため、下記のコマンドを実行する。
“`
rails g controller api/v1/registrations
“`
できたコントローラーファイルを下記のように修正する。
classを設定することで、Devis

元記事を表示

Rails7 Heroku OmniauthのGitHub認証の際に”OmniAuth::Strategies::OAuth2::CallbackError, redirect_uri_mismatch”エラーが発生する

This article shows how to resolve CallbackError when GitHub authorizing at Heroku.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0
* 開発環境
* Docker使用
* 本番環境
* Herokuにデプロイ(stack heroku-22)

### gem
* devise 4.9.2
* omniauth 2.1.1
* omniauth-github 2.0.1

## 解決したい内容
* ローカルの開発環境でOmniauthによるGitHub認証ができることを確認済み。
* Heroku本番環境においてGitHub認証を実行すると、以下エラーが発生してGitHub認証に失敗する。
* `”OmniAuth::Strategies::OAuth2::CallbackError, redirect_uri_mismatch”`

## 解決手順
* `config/initializers/devise.rb`に以下を追記する。`https://hog

元記事を表示

Rails7 リファクタリング 複数Modelで共通した処理をModuleに切り出す

This article shows how to reafactor common methods across multiple models.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0

## 実装したい内容
* 以下の記事の続きです。
* [Rails7 リファクタリング ポリモーフィックな参照を持つレコードの新規作成を共通化する](https://qiita.com/KOH6/items/68287399989bfcd9258d)
* ポリモーフィック関連の共通処理を例として記載しますが、複数モデルに同じ処理を記載している場合同様にリファクタリング可能です。
* 以下のように3つのモデルで全く同じ処理を記載しているケースを想定。(関係する処理のみ抽出して記載)

“`rb:like.rb
class Like < ApplicationRecord # 複数モデルで以下のような全く同じ処理を記載している after_create :create_notification private def create_

元記事を表示

Rails7 リファクタリング ポリモーフィックな参照を持つレコードの新規作成を共通化する

This article shows how to make a common code to create records when using Polymorphic Associations

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0

## 実装したい内容
* ポリモーフィック関連を使用して複数のテーブルへの参照を1カラムで定義する。
* SNSアプリを作成する上での通知機能の実装を想定する。UserモデルとPostモデルに参照を持つNotificationモデルのレコードを作成する。
* NotificationモデルはPostレコードに対していいね(Like)、コメント(Comment)、リポスト(Repost)された際に作成されるものとする。
* ポリモーフィックなカラムとしてNotificationテーブルには`action`カラムを定義する。

関係するアソシエーションを下記する。
“`rb:notification.rb
class Notification < ApplicationRecord belongs_to

元記事を表示

Rails7 ストロングパラメータ取得メソッドに画面入力された項目以外を追加する

This article shows how to create/update a record with adding parameters other than Strong Parameters.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0

## 解決したい内容
* formを使って画面で入力された情報を元にレコードの新規作成/更新を行いたい。
* コントローラで受け取る情報については、StrognPrametersを使用して意図しない項目が設定されることを防ぎたい。
* 一方で、画面で入力された項目以外にパスパラメータやURLのクエリパラメータで指定された内容等を自由に追加したい。

## 解決手順
* StrongPrametersでparamsを取得した後に、自分が追加したい項目を`merge`して返すようにする。

“`rb
# 例)Commentレコード作成時にパスパラメータで渡ってきたPostテーブルのIdを追加する場合
class CommentsController < ApplicationController d

元記事を表示

Rails:devise_token_authで発生するNoMethodError: undefined method `downcase’ for nil:NilClass エラーについて

環境
ruby 3.2.2
rails 7.0.8
devise 4.9.2
devise_token_auth 1.2.2

# 1.エラー
Railsのログイン認証用のgemであるdevise_token_authを使ってログイン機能を実装しようとしたところ、APIにリクエストを送った時点でRails側のログでこのようなエラーが表示されました。

“`text
NoMethodError in Api::V1::Auth::RegistrationsController#create
undefined method `downcase’ for nil:NilClass
“`

# 2.対処法
config/initializers/devise_token_auth.rbに:’authorization’ => ‘authorization’を追加

“`ruby:config/initializers/devise_token_auth.rb
config.headers_names = {:’access-token’ => ‘access-token’,

元記事を表示

CircleCI でデータベース接続のHOST設定はどうすれば良いのか ( 127.0.0.1 / localhost で接続エラー )

# エラー例 – Rails + Postgress の場合

`rails db:create` の実行でDBに接続できずにエラーが発生する

“`
could not connect to server: Connection refused
Is the server running on host “127.0.0.1” and accepting
TCP/IP connections on port ****?
“`

データベース接続のホストには何を指定すれば良いのか

# 解決

circleCIの設定で以下のように Dockerコンテナに付けた名前がそのままホスト名として使えるようだ

以下の例だとCircleCIの他のdockerコンテナからホスト名として `example-db` を参照できるようになる

“`
.circleci/config.yml
“`

“`yml
jobs:
test:
docker:
– image:
name: “example

元記事を表示

【chart.js】x軸ラベルの重複を排除して先頭の値だけ出力したい!

# ? 前提
– **chart.js 0.1.4** (下記を参考に導入)
https://qiita.com/kei-kun1960/items/b84a7e421e3ed2620be9
– **Rails 6.1.7.3**
– **ruby 2.7.5**

# ? 実践
## 【課題】chart.jsでx軸ラベルで重複を除きたい
例えば同じ日のデータが複数ある場合に
x軸ラベルに同じ日付が並ぶと凄く見づらいし冗長。

こんな感じ?![スクリーンショット 2023-10-01 15.42.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3073335/b0ce9181-5e1a-871e-3d07-42e074107406.png)

## 【解決法】 データラベルの配列に「空白」を格納する
chart.jsへ渡すx軸用のデータを編集する際に、配列の一個前の要素と比較し空白を格納していきます。

“`ruby:model
# グラフのx軸ラベルを返す
def graph_label

元記事を表示

Rails7 ActiveStorage レコードに画像添付済みかの判定を行う

This article shows how to judge whether to be arleady attached an image when using ActiveStorage.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0

## 解決したい内容
* ActiveStorageで画像を添付する。レコードにすでに画像が添付済みかの判定を行いたい。
* `nil?`で判定すると常時`false`が返ってくるので、一見画像が添付されているように見える。しかし、画像の実体をうまく取得できない。

## 解決手順
* nil判定ではなく、`attached?`メソッドを使用して判定する。
* 補足:画像の実体は`blob`レコードなので実体を見たい場合は`image.blob`のようにして参照を1段階深くたどる必要がある。

“`rb
# 例)Userモデルのimage項目に画像を添付する
# nil判定では添付済み判定を正しく行えない。画像自体は未添付でもnil?はfalseを返す。

# id=1のレコードのimageには画像添

元記事を表示

Rails7 Docker環境 deviseで生成されたviewの変更が反映されない

This article shows how to reflect view file change when using devise gem and Docker container.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0
* 開発環境
* Docker使用
* DBのimage postgres:14-alpine

### gem
* devise 4.9.2

## 解決したい内容
* deviseで生成されたviewの変更がブラウザ仮面上で表示しても反映されない。
* 開発時にはDocker環境を使用している。

## 解決手順
* deviseの設定ファイルの編集
“`rb:config/initializers/devise.rb
# デフォルトでコメントアウトされている箇所を解除し、trueに変更する。
config.scoped_views = true
“`

* コンテナの再起動を行う。
* ※Docker環境で変更が変更されないような場合は、コンテナ再起動をすると反映されるケースがままあります。
`

元記事を表示

Rails7 ActiveStorage レコードに添付済みの画像を複製して別レコードに添付する

This article shows how to duplicate a image flie already stored when using ActiveStorage.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0
* 開発環境
* Docker使用
* DBのimage postgres:14-alpine
* 本番環境
* Herokuにデプロイ(stack heroku-22)
* Active Storageの画像の保存にはAmazon S3使用

## 解決したい内容
* 別レコードにすでに添付されている画像データを別レコードに複製して添付する。
* 新規添付時には以下のように添付できるが、既存レコードに添付済みの画像を複製して添付したい。
“`rb
# 例)Productモデルのimage項目にasset内のdummy.jpgを添付する場合
product.image.attach(io: File.open(Rails.root.join(“app/assets/images/dummy.jpg”)),

元記事を表示

Rails7 devise4.9.2 ユーザ新規登録時のメール送信でNet::ReadTimeoutエラー

This article shows how to resolve an error when devise’s sign-up mail sending.

## 環境情報&前提条件
* Ruby 3.2.1
* Rails 7.0.0
* テンプレートエンジンとしてslimを使用
* 開発環境でDocker使用
### gem
* devise 4.9.2

## 解決したい内容
* deviseを使用してユーザの新規登録を行いたい。
* 新規登録した際のメール送信後に以下エラーがブラウザ上で表示される。
“`
Net::ReadTimeout (Net::ReadTimeout with #)
“`

## 解決手順
* deviseで生成される`app/views/users/registrations/new.html.slim`内のformタグに`data: {turbo: false}`をつけることで解消
* ※画面遷移系で原因不明のエラーに悩まされる場合、turboを無効化することで解決するケースが多いです。

“`slim:a

元記事を表示

ログを確認するのに毎回Railsアプリを立ち上げるのは意外と辛い

# はじめに
Railsの開発を進める中で、rails serverが起動するまでの待ち時間が意外とストレスでした。
一方で、development.logに出力されるログは多すぎて…

そこで、リクエスト時のログを各コントローラのアクションごとに管理できるよう、各フォルダに分割して出力するgemを作成してみました。

[custom\_log\_space \| RubyGems\.org \| コミュニティのgemホスティングサービス](https://rubygems.org/gems/custom_log_space)

# インストール方法
Gemfileに以下のように`gem ‘custom_log_space’`を追加して、`bundle install`を実行してください。

“`diff
group :development do
+ gem ‘custom_log_space’
end
“`

# 使い方
ローカルでrailsアプリを立ち上げて、画面にアクセスすると、log/custom_log_spaceディレクトリ配下に、以下の命名規則で、ログが出力

元記事を表示

OTHERカテゴリの最新記事