Rails関連のことを調べてみた2022年03月12日

Rails関連のことを調べてみた2022年03月12日

【エラー備忘録】Windowsローカル環境で$rails db:resetできない場合にマイグレーションを行う手順

# 目次
– 状況、前提
– エラー内容
– 原因
– 解決方法
– 参考リンク

# 状況、前提
Railsでポートフォリオを作成している最中、マイグレーションしなおそうと$rails db:resetした際にエラーにハマる。
Windows 11
Ruby 3.0.2
Rails 6.1.4

# エラー内容
“`
Permission denied @ apply2files – C:/myapp/db/development.sqlite3
Couldn’t drop database ‘db/development.sqlite3’
rails aborted!
Errno::EACCES: Permission denied @ apply2files – C:/myapp/db/development.sqlite3

Tasks: TOP => db:drop:_unsafe
(See full trace by running task with –trace)
“`

# 原因
Windowsではrailsコマンドでファイルを削除できないのが原因。

# 解決

元記事を表示

Userモデルのバリデーションを解説【Ruby on Rails】

## どんな値も取れるname属性・email属性は問題!
例えば`name`は空であってはならず、`email`はメールアドレスのフォーマットに従う必要がある。さらに、メールアドレスをユーザーがログインするときの一意のユーザー名として使おうとしているため、メールアドレスがデータベース内で重複することのないようにする必要もある。

属性値には、何らかの制約を与える必要がある。Active Recordでは**検証(Validation)** という機能を通して、こういった制約を課すことができるようになっている。

よく使われるのは
* 存在(preference)の検証
* 長さ(length)の検証
* フォーマット(format)の検証
* 一意性(uniqueness)の検証
* 確認(confirmation)の検証

### 検証はテスト駆動開発にぴったりの機能!
`setup`メソッド内の処理は、各テストが走る直前に実行される。`@user`はインスタンス変数だが、setupメソッド内で宣言しておけば、全てのテスト内でこのインスタンス変数が使えるようになる。
したがって、`

元記事を表示

rails db:migrateを実行した時に出たエラーを解決した話

# はじめに
1月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
今回は rails db:migrateコマンドを実行した際に出たエラーについて書きます。
※Ruby2.6.5の環境を使用し学習しています。

# 問題
rails db:migrateコマンドを実行すると下記エラーが出ました。
ただ、思い当たる節が合ったためすぐに解決することができました。
“`:ターミナル
% rails db:migrate
== 20220310072650 DeviseCreateUsers: migrating ================================
— create_table(:users)
-> 0.0159s
— add_index(:users, :email, {:unique=>true})
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
“`

元記事を表示

【Rails】ソート機能の実装(星レビュー、投稿日順)

## はじめに
前回実装した星レビュー機能へ
星レビュー評価の高い順、投稿日が新しい古い順に並び替えできるように機能を追加していきます。

– 前回の記事

https://qiita.com/kcl215/items/e226ac58d14360fd1b8e

## 今回実装していく流れ

– モデルにカラムデータの取り出し方を指示する記述をする
– コントローラーのアクションを追記する
– ビューにソートするためのリンクを作る
– 日時を日本時間へ変更する

## 開発環境
– ruby 2.6.3p62
– Rails 6.1.4

## 完成図

![sort.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581621/d5a3dc62-e50e-f0ac-12fd-16908eccb416.gif)

## 1. モデルにカラムデータの取り出し方を指示する記述をする

`scope`ヘルパーを使って

“`diff_ruby:app/models/book.rb
class B

元記事を表示

【個人開発】AI技術を用いたジョジョ立ち検定サービスをリリースしましたッ!

[![ogp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1519716/77a9d63b-51e9-04ee-c7b7-4c70be1ba7ef.png)](https://jojo-pose-exam.jp)
AI技術を用いてユーザーのジョジョ立ち画像を解析し、
ジョジョ立ちの合否を判定する検定サービスをリリースいたしました!

**▼ サービスURL**
[https://jojo-pose-exam.jp](https://jojo-pose-exam.jp)

**▼ 筆者の受験結果ページ**
[https://jojo-pose-exam.jp/exam_results/c71da2f4-fdd8-4851-bbf1-e1f831f0b255](https://jojo-pose-exam.jp/exam_results/c71da2f4-fdd8-4851-bbf1-e1f831f0b255)

# はじめに
はじめまして、ジョジョ好きエンジニアのやまもとと申します。

– **「ジョジ

元記事を表示

Ruby on Railsでデータベースのテーブル名とカラムデータを確認する方法

(開発環境:Ruby3.1.0 Rails7.0.2.2)

まずはターミナルで確認したいアプリケーションディレクトリに移動(ディレクトリの移動方法:cd 1階層下のディレクトリ名)

“`ruby:qiita.rb
ディレクトリ名% rails c #Railsコンソール起動
irb(main):001:0> 確認したいデータのモデル名.all
“`

これで以下のようにテーブル名とカラムデータの内容が確認できます。

“`ruby:qiita.rb
(1.8ms) SELECT sqlite_version(*)
モデル名 Load (0.3ms) SELECT “テーブル名”.* FROM “テーブル名”
id: 1, #自動生成
name: nil, #任意に生成したデータ名(データ名は(例)name、nilは値が何もないという表記)

元記事を表示

動的メソッドの解説

メタプログラミングRuby3章を読んでそれをまとめてみようとおもいます。

タイトルにある動的メソッドとは何なのでしょうか?

## 動的にメソッドを呼び出す
Rubyではメソッドを呼びだすときはドットを使って呼び出しています。
“`array.count“`のようにオブジェクトにたいしてメソッドを呼び出しています。
そのほかにsendメソッドを使う方法もあります。以下のような使い方をします
“`
class Example
def ex_method(arg)
arg * 3
end
end

obj = Example.new
obj.ex_method(30) #=> 90
obj.send(:ex_method, 30) #=> 90
“`
同じex_methodを呼び出してはいますが、コードを実行する際に呼び出すメソッドを決められるのがsendメソッドのポイントです。
このように、コードの実行時に呼び出すメソッドを決められることを**動的ディスパッチ**といいます。

このようにメソッドを動的に呼び出すことができることを紹介しましたが、メソッドを動的に

元記事を表示

駆け出しエンジニアのCI改善 (その1 seed.rbの作成)

## 自己紹介: 駆け出しエンジニア
はじめまして。
私はRailsで自社サービスの開発を行っている駆け出しエンジニアです。
2020年11月|エンジニアとしての学習を開始
—|—
**2021年5月**|**エンジニアへ転職**
**2022年3月**|**現在**(10ヶ月目)

現在、自動テスト作成の業務に取り組んでいます。
取り組んだことや気づいたことについて少しずつ記載して行きたいと思います。

### 実行環境: Ruby3.0 & Rails6.0
Ruby|3.0.3
—|—
**Rails**|**6.0.4.6**

## 目標: GithubActionsでテストを並列実行する

3つのステップに分けて進めて行きます。
1. テスト用DB作成の為にseed.rbを作成する **← 今回の記事**
1. GithubActionsで自動テストを作成する
1. 自動テスト実行時にテストカバレッジの測定をする
1. GithubActionsのテストを並列で実行したい (目標)

ということで、今回は1の **テスト用のDB作成の為にseed.rbを作成

元記事を表示

CircleCIでECSでタスクを実行する際の注意点

## 概要
今回は`CircleCI`を用いてECSのタスクを実行する際に少し手間取ったのでその原因と解決法を載せておきます。

## 前提
`Rails`を使用して`db:migrate`を実行するため、
`CircleCI`を用いてデプロイ時にECS(Fargate)上で`db:migrate`用のタスクを起動します。

## 手間取った要因
タスクを実行する際に最初にデプロイしたときのタスク定義が使用されてしまって、
ローカル上でデータベースに変更を加えた内容がデプロイ時に反映されないという現象が起こった。

## 原因
この解決法は簡単で、`CircleCI`の設定ファイルにタスク定義を更新するジョブを記載していなかったことが原因でした。
なので下記のように訂正しました。
(修正前)

“`config.yml
workflows:
version: 2
build-test-deploy:
jobs:

# 省略(他の設定は省略しています)

– aws-ecs/run-task:
name: db-migrate

元記事を表示

Rails6でBootstrapを使う

## はじめに
構築で少し迷ったので備忘録
Rails6にbootstrap 5系と4系それぞれの導入方法を記載します。

## 環境
M1 Mac
VScode
ruby 3.1.0
rails 6.0.4.7

## 注意点
bootstrapのversion違いで動かないケースがある
5系と4系ではsetupの仕方が若干違うので、installするversionに合わせて構築する必要がある。

エラーが出力されずbootstrapが動かない原因の多くは、bootstrapのversionと設定が噛み合っていないから

installしたのは5系だが、4系を前提とした設定をしているなど

## bootstrap version 5系
5系は`jquery`が必要なくなりました

## terminalで下記を実行
“`shell
# 2022.03/10 時点では5系のbootstrapがinstallされる
# versionの指定は記事下部を参照
$ yarn add bootstrap@next
$ yarn add @popperjs/core
“`

“`she

元記事を表示

rails consoleでメソッドの一覧や定義場所を確認する

# はじめに
Railsでコードを書いているときにメソッドの有無や定義場所を調べたい!となることがあったので、方法をまとめておきます。

# メソッドの一覧を確認する
メソッドの一覧は`methods`メソッドで確認できます。
使用可能なメソッドがシンボルの配列として返ってきます。

“`irb
[1] pry(main)> user = UserController.new()
=> #
[2] pry(main)> user.methods
=> [:index,
:show,
:create,
:update,
# ~省略~
“`

# メソッドの定義場所を確認する
`method`メソッドと`Metho#source_location`メソッドで確認できます。
0番目の要素に定義ファイルの絶対パスが、1番目に行数が入った配列が返ってきます。

“`irb
[3] pry(main)> user.method(:index).source_location
=> [“/home/user/workspa

元記事を表示

Rails gem postgresqlをインストールできない時の対処法。

## はじめに
Railsを使用して開発した、アプリケーションをherokuにデプロイする際、本番環境用のデータベースとして、PostgreSQLを設定する必要があったのですが、その時に少しハマったので、解決策をここに記録しておきます。

## PostgreSQLの導入
heroku上のデプロイする際、RailsのデフォルトデータベースのSQliteは使用することができないので、本番環境用のデータベースとして、PostgreSQLを導入します。

まず、開発環境では、sqliteを使用し、本番環境では、PostgreSQLを使用する設定をGemfileに記述します。
~~~ruby:Gemfile
# Use sqlite3 as the database for Active Record
gem ‘sqlite3’, ‘~> 1.4’, group: :development
gem ‘pg’, ‘~> 1.3’, ‘>= 1.3.3’, group: :production
~~~

次に、gemfileに記述した内容ターミナルでをインストールします。
~~~teminal:t

元記事を表示

bundle execとbinstubを理解する

# はじめに

[Everyday Rails](https://leanpub.com/everydayrailsrspec-jp)でRSpecの学習をしていたところ、以下のようなコマンドと説明が出てきました。

“`shell
bundle exec rspec
“`

> Rails アプリケーションは Bundler の使用が必須であるため、RSpec を実行する際は bundle exec rspec のように毎回 bundle exec を付ける必要があります。
> binstub を作成すると bin/rspec のように少しタイプ量を減らすことができます。

– Railsはbundlerを使うため、`bunle exec`が必要。
– binstubによってショートカットを作成できる。

ということはわかったのですが、もう少し詳しく知りたくなったので調べてみました。

## ざっくり結論

– `bundle exec`は、現在のプロジェクトのコンテキストでコマンドを実行するために必要。
– プロジェクトのコンテキスト = `gemfile.lock`に基

元記事を表示

ええ!?Getting Started with Rails(7)で詰まるなんてあっていいんですか!?

# -1: これは何?
公式チュートリアル[Getting Started with Rails v7.0.2.3](https://guides.rubyonrails.org/getting_started.html)を進める上で詰まったこと備忘録(進行形).
# 0: 環境について
* WSL2
* VSCode
* Docker
* Ruby 3.1.1p18(2022-02-18 revision 53f5fc4236)
* Rails 7.0.2.2
DockerイメージはDocker公式のクイックスタート[Quickstart: Compose and Rails](https://docs.docker.com/samples/rails/)とZennの記事[Ruby 3.1 と Rails 7 のプロジェクトを Docker内で作成してみる](https://zenn.dev/nakazawaken1/articles/0f5515cde2ddf3)を参考に構築した.

# 1: Failed to save ‘index.html.erb’うんたらかんたら
## 詳

元記事を表示

ビューやコントローラー以外で `user.avatar` のurlにアクセスする

ビューやコントローラーでは `url_for` や `rails_blob_path` といったヘルパーメソッドが使える。しかし、それ以外の箇所ではこれらのメソッドをそのまま使うことができないため、ファイルのURLにアクセスするには `Rails.application.routes.url_helpers.rails_blob_path` のような長い記述が必要になる。

開発環境の場合は特に `default_url_options[:host]` を `localhost:3000` などにセットしておく必要がある。

“`rb:development.rb
Rails.application.routes.default_url_options[:host] = ‘localhost:3000’
“`

また `include Rails.application.routes.url_helpers` のようにすることで `rails_blob_path` をそのまま使えるようにすることも可能。

“`rb
class User < ApplicationRecord

元記事を表示

ActiveStorageでN+1回避のための `with_attached_#{name}` が使えないとき

Userモデルから10件取得し、それぞれのavatarを参照する場合を考える。
何も考えずにやるとN+1クエリの問題が発生してしまう。

“`rb
class User < ApplicationRecord has_one_attached :avatar end # N+1クエリが発生する User.limit(10).each do |user| p user.avatar.attached? end ``` N+1クエリを回避するためには `with_attached_#{name}` という [scope](https://github.com/rails/rails/blob/166b63eb674b56faf4f75dfe300b14f00fb79dae/activestorage/lib/active_storage/attached/model.rb#L66 ) が使える。[^1] [^1]: `has_many_attached` の場合は [こちら](https://github.com/rails/rails/blob/166b63eb674b

元記事を表示

Rspecよく分からーんとお悩みのそこのあなたへ

## はじめに

チームで開発している時にメンバーから
「Rspecよく分からーん」
という悩みの声があがりました。
確かに僕が初めてRspecに触れた時にも同じような感想を抱いた覚えたありました。
Rspecが何故分かりにくいのか説明し、じゃあどうしたら分かるようになるか?を解説していきます!

## 環境

今回の例をテストできる環境を用意しましたので手元で実際に試しながらやると理解が捗ると思います。
[GitHubはこちら](https://github.com/yamamoto-hiroya/rspec_practice.git)
[DockerHubはこちら](https://hub.docker.com/r/hiroyayamamoto/rspec_practice)

### 実行手順

githubのREADMEに記載の通りです。

“`bash
git clone https://github.com/yamamoto-hiroya/rspec_practice.git
cd rspec_practice/
docker-compose up -d
docker e

元記事を表示

error Command “webpack” not found.

## Railsチュートリアル
### 経緯
Railsチュートリアルを進めている中で、herokuへのPushができなくなりました。
ログを確認してみると以下のErrorが発生していました。

### Error内容※一部抜粋
“`
.
.
.
Compiling…
Compilation failed:
error Command “webpack” not found.
“`
### 結論
以下のコマンドを実行すると解決します。
`$ rails webpacker:install`
`$ bundle install –without production`
`$ bundle update`
`$ git add -A`
`$ git commit -m “Install webpacker”`
`$ git push origin master`
`$ git push heroku master`
### エラーの理由
webpakerがインストールされていないことが原因だったようです。
この他にもブランチ名がheroku側と一致していない場合もあるみたいなので、

元記事を表示

Precompiling assets failed. Herokuデプロイエラー解決法

## エラー内容

いつも通り“`git push heroku main“`でデプロイしようとしたら、“`Precompiling assets failed.“`なるエラーが発生?

## 開発環境
Rails6系
Ruby3系
Herokuデプロイ済

## 結論
“`manifest.js“`の“`//= link_tree“`で指定していたディレクトリが空だったので、そこにファイルを入れたらエラー解消しました!!!

## 解決に至るまで

その1
“`Precompiling assets failed.“`エラーが発生

その2
“`terminal:terminal
% heroku logs –tail
“`
でエラー詳細を確認→「Herokuのダッシュボードのログを見よ!」とのログとリンクを発見

その3

元記事を表示

Array と Parameters の `select!` について

# `Array#select!` と `Parameters#select!` の返り値が違う

– `Array` の方は,ブロックの返り値の全部が `true` を返した場合に `nil`を返している
– 変化が無いので `self` を返さないとのこと
– `ActionController::Parameters` の方は,最後に `self` を強制的に返すようになっている

普通はひっかからないと思うけど,これに依存したコードを書くのは良くなさそうなので,一応記す.
→ `select!` を使わないだろう.の意

## Refs

– https://docs.ruby-lang.org/ja/latest/class/Array.html#I_FILTER–21

“`ruby
a = %w{ a b c d e f }
a.select! {|v| v =~ /[a-z]/ } # => nil
a # => [“a”, “b”, “c”, “d”, “e”, “f”]
“`

– https://apidock.com/rails/v6.1.3.

元記事を表示

OTHERカテゴリの最新記事