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

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

フォームオブジェクトで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

RSpecの”GET #show”で[:ok]のはずが[:found]となってしまった話

## 概要

request specの”GET #show”にてリクエストが成功するかテストを行なってみたところ、HTTPステータスコードが200(:ok)を期待したが、302(:found)が結果として出力された。

“`bash:ターミナル
$ bundle exec rspec spec/requests/recipes_spec.rb

# ===== 省略 =====

GET #show
レシピIDを渡してリクエストを投げたとき
リクエストが成功する (FAILED – 1)

Failures:

1) Recipes GET #show レシピIDを渡してリクエストを投げたとき リクエストが成功する
Failure/Error: expect(response).to have_http_status(:ok)
expected the response to have status code :ok (200) but it was :found (302)
# ./spec/requests/recipe

【Rails】find_or_create_byでバリデーションをskipさせたい

# 結論
## 1.saveに `validate: false`を渡す
– `validate: false`を末尾に記載することで、バリデーションをskipできました。
– 加えて、無意味な`save`を2回走らせないように、`find_or_create_by` から `find_or_initialize_by` に修正しました。

“`ruby
Model.find_or_initialize_by(name: “テスト”) do |m|
m.published_at = Time.zone.today – 1 # バリデーション対象のコード
m.save(validate: false) #=> バリデーションをskipさせる
end
“`

# 補足
@jnchitoさんよりコメントいただきました。

## 1.new_record?メソッドを使用する
ブロックの外で`save(validate: false)`を実行します。

“`rb
# この時点ではsaveしない
model = Model.find_or_initialize_by(name: “

AWS本番環境のdockerで rails assets:precompile がimageに反映されずハマった件

AmazonLinux2のDocker環境に対し、gitlabでbuild、ECRにpush、eb deploy でデプロイするフロー。

build時にDockerfileで `rails assets:precompile` を実行していたが、なぜかデプロイされて起動したコンテナ内にはassetが作成されていない、つまり docker imageに反映されていない。

色々調べたが、docker-compose.ymlのvolumeにファイルを置いているディレクトリを書いていたからだった。
開発環境ではないので、ホストのディレクトリとコンテナをマウントする必要がなかった。
ちなみに railsのversionは`6.1.3.1`。
最終的に、以下のようなファイルとなった。

“`Dockerfile:Dockerfile_production
FROM ruby:3.0.1
ENV RAILS_ENV=”production”
ENV NODE_ENV=”production”

RUN \
apt-get update -qq && apt-get install -y b

Rails 7.xをHerokuにデプロイする

まずHerokuにログインする。アカウントを持ってない方は作成してください。
“`bash:ログイン
$ heroku login
“`
次にHeroku上にアプリを作成する。
“`bash:アプリ作成
$ heroku create -a “アプリ名”
“`
ただしアプリ名には命名規約があるので注意。
アルファベットの小文字・数字・ハイフンのみを含み、先頭はアルファベット、末尾はアルファベットか数字である必要がある。

“`bash:リモートリポジトリの指定
$ heroku git:remote -a “アプリ名”
“`

`Gemfile`の以下の行
“`ruby:Gemfile
gem ‘sqlite3’
“`
を消して、以下のグループ
“`ruby:group :development, :test
group :development, :test do

gem “sqlite3”
end
“`
の中に記述する。

同ファイル内に次の行を追加する。
“`ruby:Gemfile
group :production do
gem “pg”

アプリを作成する ユーザーの一覧を表示させる

# ヘッダーに表示させる。
progateに“`application.html.erb“`を使ってヘッダーを統一しようと思う。
まず“`application.html.erb“`を確かめてみる。

## “`application.html.erb“`を確認
“`application.html



Garden

<%= csrf_meta_tags %>
<%= csp_meta_tag %>

<%= stylesheet_link_tag "application" %>


<%= yield %>


“`
“`<%= yield %>“`で表示されるようになっている。
### そもそもこの“`yieldとは何か?

コードの自動整形ツール【Rubocop】を導入方法と使い方( Rails gem)

今回はコードの自動整形ツール【Rubocop】を導入方法・使い方をご紹介いたします。

## Rubocop(ルボコップ)とは?

Rubyの静的コード解析ツールです。「インデントが揃っていない」「余分な改行・スペースがある」などの指摘をRubyStyleGuideに基づいて行ってくれます。

Rubocopを導入することにより、コードの品質を担保できるようになります。

####  ● Rubocop の公式GitHub
https://github.com/rubocop/rubocop

## Rubocopの導入方法

①Gemfile の group :development do〜end内に記述

“`
group :development do

gem ‘rubocop’, require: false #こちらの1行を記述

end
“`

※最後尾に記述するのではないので、記述場所にご注意ください。

②ターミナルで以下を1つずつ実行

・Gemfile.lockを更新する
“`
bundle install
“`

・rubocopの設定を記述す

AWC EC2にWebシステムのデプロイ(下書き

つらつらと仕事中の備忘録
書きながらやっているので後日清書予定
AWSEC2にDocker+Railsの環境を構築してテストしようという作業

EC2インスタンス
・最低コスト
・とにかく動け
・Ubuntu

流れ

・手始めにEC2にセキュリティグループの設定を修正
 →テラターム接続は失敗したので暫定でGit Bushで接続。上記設定に関係あるか不明

・下記URLを参考にDockerとDockerComposeをaptとcurlを使ってインストール。

・sshの設定、key登録をgithubと”EC2インスタンス”にする(Ec2側にssh-addをかまさないとダメ。また、かますときはevalでプロセス明確する)

・gitcloneをする(解決)
 →sudo chown ユーザー名:ユーザー名 /var/www # 現ユーザーに権限付与 をしてなかった

・dockerをデプロイ(権限がなくて混乱)
 →https://virment.com/how-to-fix-couldnt-connect-to-docker-daemon/
 ここを参考に修正中
・build

Rails6にjQueryを導入する方法

Rails6から標準で導入されているWebpackerを利用することで、jQueryを簡単に実装できます。

Rails5で書かれている記事も多かったのでだいぶ混乱していました。。

# Rails5以前との違い
**1. gemが必要ではなくなった**
以前までは“`’jquery-rails’gem“`をインストールする必要がありましたが、Rails6からはgemの追加が必要なくなり、代わりにwebpackで必要な情報をインストールしていきます。

**2. jQuery関連ファイルの保存フォルダが違う場所にある**
かつては“`app/assets/javascripts“`フォルダに保存していましたが、Rails6以降は“`app/javascript“`フォルダに変更となります。

# jQueryのインストール
**そもそもjQueryとは**

JavaScriptをより簡単に記述するためのライブラリのひとつ。

したがって、jQuery(ライブラリ)を使うのであればJavaScript(元のプログラミング言語)にコンパイル(翻訳)する必要があります。
そのた

Railsで使用するコマンド

Railsで使用する基本的なコマンドについてまとめた記事です。

# プロジェクトの作成
“`:#プロジェクトの作成
rails new アプリケーション名 [オプション]
“`
“`:#オプション(一部)
# ファイルが存在する場合に上書き
–fまたは -–force

# データベースの種類(MySQL)
–d=mysql または -–database=mysql

# データベースの種類(PostgreSQL)
–d=postgresql または –database=postgresql

# V(ビュー)を生成しない
–api
“`
# Controllerの作成・削除
“`:#コントローラの作成
rails g controller コントローラー名 メソッド名1 メソッド名2 …
“`

“`:#コントローラの削除
rails d controller コントローラー名
“`
# Modelの作成・削除
“`:#モデルの作成
rails g model モデル名 カラム名1:カラムの型 カラム名2:カラムの型 …
“`
“`:#モデ

Rails6でシステムスペック(capybara 導入)

## はじめに
先日、Rails6 でシステムスペックのテスト実行の際に Capybara が導入されておらずエラーが発生してしまいました。
Rails6 では Capybara はデフォルトでインストールされているはずなのに何故かエラーとなってしまう…。
その原因としていくつか勘違いしていた事がありましたので、まとめたいと思います。

### 開発環境
– Rails 6.1.4
– ruby 2.7.3
– rspec-rails 5.1.2

## Capybara の設定
spec_hepler.rb に capybara の設定を追加します
“`spec_hepler.rb
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration

require ‘capybara/rspec’

RSpec.configure do |config|
config.before(:each, type: :system) do
driven_by :rack_test
end

co

3カ月の学習を終えて

現職からの転職を考えて、プログラミングの学習を始めてから約3カ月。
企業提出用のポートフォリオがひと段落ついたため、こちらのQiitaのほうに今までの学習の振り返りや発生したエラーの解決方法を備忘録として投稿していこうと思います。
主に使用した言語はHTML、CSS,Ruby,Railsです。

# HTML,CSS
簡単に言えばWEBサイトを構成するための言語です。
HTMLでWEBサイトの大まかな構造を作り、CSSで外観を整えるといったイメージ。
# Ruby
WEBアプリケーションを作るために必要な言語
#### HTMLとの違い
HTMLは「WEBサイト」を作るための言語、対してRubyは「WEBアプリケーション」を作るための言語です。
「WEBサイト」は訪問者が受動的に閲覧するものです。つまり、静的なページのことです。

一方「WEBアプリケーション」は訪問者に能動的な動作を求める者です。閲覧だけでなく、情報を入力してもらい、その内容によって表示が変わります。
具体的には、ユーザー登録機能や検索機能などです。入力した内容によってマイページの表示は変化するし、検索結果も当然変わ

Railsのマイグレーション関連のコマンド(備忘録)

# はじめに
Rialsのマイグレーション関連のコマンドを備忘録としてまとめました。

# migrationとは?

【Railsガイド参照】

マイグレーションは、データベーススキーマの継続的な変更(英語)を、統一的かつ簡単に行なうための便利な手法です。マイグレーションではRubyのDSLが使われているので、生のSQLを作成する必要がなく、スキーマおよびスキーマ変更がデータベースに依存しなくなります。

個別のマイグレーションは、データベースの新しい「バージョン」とみなせます。スキーマは空の状態から始まり、マイグレーションによる変更が加わるたびにテーブル、カラム、エントリが追加または削除されます。Active Recordはマイグレーションの時系列に沿ってスキーマを更新する方法を知っているので、履歴のどの時点からでも最新バージョンのスキーマに更新できます。Active Recordはdb/schema.rbファイルを更新し、データベースの最新の構造と一致するようにします。

マイグレーション機能があることによ

Axios × Rails 複数の画像を非同期通信で楽天FTPサーバにアップロードする

# 前提
仕事で楽天FTPサーバに画像をアップロードする作業ができてしまって、毎回FTPソフト開くのが面倒だなと思い簡単なウェブアプリを作りました。

# 完成品
ファイルを選択し、アップロードボタンを押すだけ。あとはRailsくんが頑張ってFTPにあげるのを待つのみ。
画像は1枚でも複数枚でも対応できます。
![スクリーンショット 2022-05-19 21.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1227249/244644db-6a23-17c1-ad39-2b1b937a379b.png)

# この記事で言及しないこと
* 上記の画像プレビュー機能(`new FileReader`とか`readAsDataURL`でググると良記事がたくさん出てきます)
* フロントはVue3で書いています。`@change`とか文法的なことは説明しない。
* axiosの使い方

# フロント
## html
“`html