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

Rails関連のことを調べてみた2022年05月23日
目次

Gemをインストールする時に関連するGemを自動でインストールする

Rubyでは標準でRubyのライブラリを管理するRubyGemsというコミュニティがあり、gemというコマンドを使用することでRubyGemで管理されているライブラリを取得できます。

RailsではGemfileというアプリケーションで使用するGemの情報を記述している管理ファイルです。
Gemfileにgemコマンドの後ろに取得したいGem名を記述し(既に取得しているGemのバージョンの変更も可)、installを実施することができますが、Gemは様々なGemが複雑に関連して動作する為、取得したいGemと関連するGemも取得する必要がある場合がある。

インストールを実施する際
“`ターミナルの作成中アプリのディレクトリ
% bundle install
“`
このコマンドを使うと取得したいGemに関連するバージョンのGemを一緒にインストールしてくれる。
これはbundlerというGemが働いてくれている。

:::note info
bundlerというGemを使うと関連するGemファイルも一緒に取得してくれる
:::

元記事を表示

RailsのAction Cableで任意のメッセージ形式でやりとりする

## 背景

REST API, WebsocketのAPIを提供するとあるサービスのMockを素早く作るため、Railsを選定したが、メッセージの形式がRailsと合わなかった。

メッセージ送信では、 `command`, `data`, `identifier`を送る必要があるが、

“`json
{
“command”: “message”,
“data”: “{\”message\”:\”test message\”,\”action\”:\”speak\”}”,
“identifier”: “{\”channel\”:\”RoomChannel\”}”
}
“`

例えば、 `command` をやめて `cmd` だけで任意のアクションを指定できるようにしたい。

## 注意

今回はローカル起動用のMockの作成を目的としていたためoverrideを試しました。
副作用の検証まではしていませんし、通常はRailに乗る方が良いので使い所は注意しましょう。

## サーバーが受け取るメッセージを任意の形

元記事を表示

volume使用時のPermissionError

# 環境
– WSL2 – Ubuntu20.04
– Docker 20.10.1
– ruby 3.1.2
– rails 6.1.5
# 問題
Volumeを使いローカルにデータを保管すると,フォルダがroot権限で作成される.
# 原因
DockerはWSL環境ではユーザーを指定していない限りコンテナがrootユーザーで実行される.
ちなみにMacOSではこの問題は起こらず,コンテナはローカルユーザーで実行されるらしい.
個人的にDockerの主なメリットにOS間の差異の吸収があるのに[それどうなの?」と感じる.
今後改善されていくのかな?知っている方はコメントお願いします.
# 対策
Docerfileのentrypointでユーザー作成と権限変更を行う

“`Dockerfile:Dockerfile
FROM ruby:3.1.2

# yarnインストール用に追加
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add – \
&& echo “deb https://dl.yarnp

元記事を表示

【Ruby on Rails】Herokuのデプロイ時のエラーについての対処法

RailsチュートリアルでHerokuにアップする時があり、
`git push && git push heroku master`と打つとエラーになりはまってしまったのでその対処法を記述しておきます。

Herokuをデプロイするために打ったコマンド
“`
$ git commit -am “Add hello”
$ heroku create
$ git push && git push heroku master
“`

出てきた内容

“`
hogehoge toy_app % git push -f heroku main
Enumerating objects: 89, done.
Counting objects: 100% (89/89), done.
Delta compression using up to 4 threads
Compressing objects: 100% (72/72), done.
Writing objects: 100% (89/89), 22.14 KiB | 2.21 MiB/s, done.
Total 89 (delta

元記事を表示

部分テンプレートを使って記述を楽にしよう

WEBアプリケーション作成をしようとプログラミングを学んでいるとファイルは違うけど中身の記述は同じ記述をするファイルを作成することが多々あります。

毎回同じコードを入力するのがめんどくさいので部分テンプレートを使ってコードを使い回しする方法を紹介します。
今回はRubyonRailsのフレームワークを使用してWEBアプリを作成する際に使用するrenderメソッドについて解説していこうと思います。

今回はWEBアプリでユーザーが画像やテキストを投稿するWEBアプリ作成する際に新規投稿フォームと編集フォームの中の形が同じ場合を想定して記述していきます。

:::note info
部分テンプレートなしver.
:::
“`new.html.erb  #新規投稿ページ

投稿する

<%= form_with(model: post, local: true) do |form| %>
<%= form.text_field :image, placeho

元記事を表示

Rails データベースの更新

データベースの更新
“`データベースの更新
rails db:migrate
“`

元記事を表示

[個人開発]ランニングシューズ選びに困っている方向けのアプリ「Shoes For Runners」を開発しました

# はじめに
簡単な質問に答えることでおすすめのシューズを提案するアプリ「Shoes For Runners」を開発しました。

**サービスを作ったきっかけ**
私が陸上部に所属していたので、部活の後輩や家族からシューズの選び方についてよく聞かれました。その時に、ネットで調べても、おすすめのシューズが複数個紹介されるものの、結局どれを買えば良いのか分からないという意見をよく聞きました。そこで、簡単に自分にあったシューズがわかるアプリを作ってみようと思いました。

# サービス概要
スクリーンショット 2022-05-06 8 36 35
ランニングシューズについて何を買えば良いかわからない人におすすめのシューズを提案するアプリです。簡単な質問に答えることで自分に合ったシューズを知ることができます。

# アプリURL
ht

元記事を表示

パスワードに英数字混合のバリデーションを設定する方法

deviseにはデフォルトでバリデーションが設定されていますが、英数字混合のバリデーションはデフォルトにはないため別途記述する必要があります。
記述内容は以下二文をuserモデルに記述するだけ。
“`ruby:user.rb
VALID_PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze
validates :password, format: { with: VALID_PASSWORD_REGEX }
“`

この正規表現を用いたバリデーションの記述により、パスワードに英数字混合のバリデーションを設定できました。
正規表現を用いれば英数字の他に全角かな/カナ漢字など、細かくバリデーションを設定することができます。

元記事を表示

Redisについて

## はじめに
RaisのプロジェクトでRedisを使っているのをよく見ていたが、使用するメリットなどをよくわかっていなかったので簡単に調べてみた。

## 詳細

### そもそもRedisとは
– 「Redis は、リモートディクショナリサーバー の略で、高速でオープンソースのメモリ内 key-value データストアです。」
– 読み方はレディス。
– 名称の由来は、`Remote Dictionary Server`から来ているそうです。

## メリット/デメリット

**メリット**
– 高速で動作する(RDBMSに比べ数千〜数万倍早いらしい)
(例えば、結果が頻繁に変化しないようなAPIのレスポンスを`cache`に溜めておくことで毎回`API call`が発生しないようにしてパフォーマンスの向上を図る。などがメジャーな用途になります。)
– Rails 5.2からデフォルトでRedisのキャッシュストアが対応され、キャッシュの導入が簡単になっている

**デメリット**
– RDB(Relational Database)のように複雑なデータは扱えない(リレーションを設

元記事を表示

M1MacのローカルでDockerを使ってRailsの環境を構築する。

Dockerでの環境構築につまづいたこととコントローラとルーティングでTOPページを表示させるのにつまづいたので備忘録として簡単に設定をやってきたことを記載します。

行ったことはほぼこの動画通りなので、記載内容について詳しく知りたい方はこちらを参照ください。
とてもわかりやすく解説されていました。

最初に準備したものは
デスクトップにフォルダを作成して以下のファイルを用意した。
・Dockerfile
・docker-compose.yml
・srcディレクトリの配下にGemfile

![スクリーンショット 2022-05-22 15.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2654361/843fdc4b-c86b-4d0f-e254-e73cc1091177.png)

src以下のGemfile以外はこの後の操作で作成される。
![スクリーンショット 2022-05-22 15.11.5

元記事を表示

RailsアプリをHerokuにデプロイする方法

# 想定環境
Rails 5.0.7.2
(Rubyバージョンは後ほど指定する。著者は当初2.6.3を使用←herokuがサポートしていないため後ほど変更が必要)
# herokuへのデプロイ手順
## 1.herokuにアプリを作成
“`
heroku login -i
“`
でherokuにログイン(パスワードはAPIkeyでないとログインできない可能性あり)
“`
$ heroku create アプリ名
“`
## 2.本番環境用にGemfileとdatabase.ymlを変更
“`diff_ruby:Gemfile
# Bundle edge Rails instead: gem ‘rails’, github: ‘rails/rails’
gem ‘rails’, ‘~> 5.0.7’, ‘>= 5.0.7.2’
# Use sqlite3 as the database for Active Record
– gem ‘sqlite3’, ‘~> 1.3.6’
# Use Puma as the app server
gem ‘puma’, ‘~> 3.0’
#

元記事を表示

Rails7 Deviseのログアウトができない

発生したエラー

>Routing Error
No route matches [GET]

Devise使用時に、ログアウトができず。。
コードには、method: :delete と記入しているのに get が反応する

“`
【変更前】
<%= link_to 'ログアウト', destroy_owner_session_path, method: :delete %>

“`

解決方法

:confetti_ball:ログイン成功:tada:

buttonスタイルなら
method: :deleteが機能してくれる

“`
【変更後】
<%= button_to 'ログアウト', destroy_owner_session_path, method: :delete %>
“`

元記事を表示

新米エンジニアが、チームの開発速度を7倍にした話

# 自己紹介
はじめまして。
2021年の末にソフトウェアエンジニアになった27歳のものです。
プログラミング歴は2022年5月頭時点で1年半、職業エンジニアになってからは半年足らずですので新米も新米です。
弊社エンジニアの技術力・設計スキル・論理的思考力の高さに劣等感も感じつつ、日々刺激を受ける毎日を送っています。

## なぜ私が職業エンジニアを志したのか
後の話にも大きく関わってきますので、ここで説明しておきます。

一言で言えば、『[LeanとDevOpsの科学](https://www.amazon.co.jp/Lean%E3%81%A8DevOps%E3%81%AE%E7%A7%91%E5%AD%A6%EF%BC%BBAccelerate%EF%BC%BD-%E3%83%86%E3%82%AF%E3%83%8E%E3%83%AD%E3%82%B8%E3%83%BC%E3%81%AE%E6%88%A6%E7%95%A5%E7%9A%84%E6%B4%BB%E7%94%A8%E3%81%8C%E7%B5%84%E7%B9%94%E5%A4%89%E9%9D%A9%E3%

元記事を表示

フォームオブジェクトでCarrierWaveを使うとアップロード先が…!

## はじめに
CarrierWaveでファイルをアップロードできるようにしたモデルから作ったフォームオブジェクトでファイルをアップロードすると、アップロード先が違ってしまい参照できなくなってしまいました。
少し工夫して参照できるようにしたので、同じようなことで困ってましたら、参考にしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14380/c8c3e949-6aeb-6974-7e24-6846b36458af.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14380/1c862ef4-c745-c978-5248-52dd1d483373.png)

## ソース
修正前: https://github.com/ken1flan/carrierwave_store_dir_sample
修正: https://github.com/ken1flan/carr

元記事を表示

備忘録 whereでオブジェクトを得れなくて困っている君へ

1.~~~ids = Object.where(条件).pluck(:id)
2.Hoge = Object.find(~~~ids)

Hogeにwhereの条件で絞った、オブジェクトが複数得れる

元記事を表示

超かんたん!エラー箇所の特定

皆さん、コーディングは進んでいますでしょうか?

私はというと…まだプログラミング初心者のため、簡単なコードを書くのでさえ
数時間と掛かってしまいます:arrow_heading_down:

注意深くコーディングしても必ずエラーが発生してしまうんですよ!何とかならんものか…:frowning2:

エラーといっても原因は様々です、

スペルミス
メソッドの使い方が正しくない
クラスの書き方がわかんない
etc

そんな超初心者な私でも**デバッグ機能なしでエラー発生箇所を絞り込める方法**があります。
良かったら、ご覧ください。

# はじめに
本記事は以下の読者様が対象です。

* プログラミング初心者

* 理由があってデバック機能を使えない

* クラスや関数のなんとなくの流れが追える

* 一所懸命コードを追ってみるが自分の脳のワーキングメモリが足りず、次のコードを見ているときには、前のコード内容を忘れてしまい、嫌な思いをしている人

* 何時間も

Mysql2::Error: Unknown column ‘messages.room_id’ in ‘where clauseの解決法

## 開発環境
Mac
Ruby 2.6.5
Rails 6.1.3.2
## エラーメッセージ
“`
$ Mysql2::Error: Unknown column ‘messages.room_id’ in ‘where clause
“`

“`rooms/show.html.erb
<% if @messages.present? %> <=この部分がエラー <% @messages.each do |m| %>
<%= m.content %>
by メッセージはまだありません

<% end %>
“`
“`
class CreateMessages < ActiveRecord::Migration[6.1] def change

ActiveRecordはどのタイミングで実際にクエリを実行しているのか。SQLキャッシュについて。

# はじめに
ActiveRecordのメソッドを使ってDBアクセスすることができますが
実際にDBアクセスするタイミングは、実は即時でなかったりします(遅延評価)。

この辺りの理解を深めて、よりパフォーマンスを意識したコードが書けるように整理していきたいと思います。

また、最後に、同じリクエスト、同じ呼び出しであればRailsのモデルにキャッシュされるため
実際にDBアクセスは行われないので、この辺りにも触れたいと思います。

# ActiveRecordの遅延評価
ActiveRecordクエリを作成する場合、多くの場合、コードはデータベースの即時呼び出しを実行しません。
これにより、毎回データベースにアクセスすることなく、`.where`などで複数の句を連鎖させることができます(メソッドチェーン)。

“`ruby
@users = User.where(soft_destroyed_at: nil)
# DBアクセスしない
@users = @users.where(join_date: Date.today)
# このタイミングでもDBアクセスしない
@users.co

[Rspec][Rails] publicなどの名前空間を使用した際のファイル命名方法

## はじめに
#### すみません、ディレクトリ構成に誤りがあったので少し修正してあります!
管理者側(admin)とユーザー側(public)を持つアプリケーションを作成中です。
Rspecを触り始めて2日目、 名前空間を使ったフォルダ・ファイルの命名規則で思いっきり躓いたので投稿します。
情報がほとんど無いため、requests(コントローラー)のテストで特に躓きました。

#### たまたま見つけられたこれから参考になりそうなGitHub
https://github.com/igaiga/rails6132_ruby301_rspec/blob/main/spec/requests/books_spec.rb

(GitHubなので少し迷いましたが公開しているならいいのかと思い載せました、もし何かあれば教えて下さい。)

#### 結合テストのとても参考にさせていただきました!

https://qiita.com/niwa1903/items/e1ad9ab39811aa1cf312

### 環境
Rails 6.1.5.1
ruby 2.6.3
RSpec 3.11

CarrierWaveでつまづいた箇所(multiple・Cache・_mounter)についてまとめる

# はじめに

一切かかわりのない方々が書いたコードを保守する機会がありました。
そこでファイルの保存に**CarrierWave**を使っており、あまりみかけない使い方をしていて理解に時間がかかったので断片的にはなりますがまとめていきます。

# つまづいたところ

CarrierWaveは利用されている割にはネットに情報がないイメージでした
以下が理解に時間がかかった箇所です

## ファイルを複数あげたい

こちらの記事を参考にしました。
[【Rails】Carrierwaveを用いて画像を複数アップロードする方法](https://qiita.com/mattan5271/items/a0ff8ab9a830d2cfcc7e)

ファイルを単体で上げられる前提で以下を修正しました。

複数ファイルを投稿できるように修正
“`erb:new.html.erb
= f.file_field :images, multiple: true
“`

CarrierWaveで複数の写真を保存できるように修正
“`book.rb
mount_uploaders :images, I