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

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

【Rails】enumとransackを使って複数条件での検索を実装する

# 環境
Ruby 3.0.0
Rails 6.1.4.4
ransack 2.5.0
enum_help

# 何ができるようになるか

![スクリーンショット 2022-02-28 9.59.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1110285/c574573d-edb0-1d28-d8cd-5854327116ea.png)

上記の画像のようにタスクをタスク名とステータスからAND検索できるようになる。
また、ステータスはenumを使って表現できるようになる。

# 手順
## ①enumを導入する
ここでは、name(タスク名)を持つTaskモデルにstatus(タスクのステータス)カラムを追加します。
今回は、Taskモデルに`未着手`、`着手中`、`完了`の3つのステータスを持たせることにします。
その場合、statusにそのまま文字列で保存するやり方もあるのですが、それだと効率が悪いためActiveRecordの機能である`enum`を使用して、それぞれのstatusに

元記事を表示

Rails コメント削除機能

## 開発環境
Mac
Ruby 2.6.5
Rails 6.1.3.2

## 問題が起きたコード
“`posts_controller.rb
def destroy
@comment=Comment.find_by(params[:id])
@comment.destroy
flash[:notice] = ‘コメントを削除しました’
redirect_to(“/posts/#{params[:post_id]}”)
end
“`
find_byメソッドで返ってくる結果は、最初にヒットした1件なので上のコードのままだとコメントを削除すると古い順から削除されてしまう。
下の記事が参考になりました。
[【Rails】コメント削除機能の実装(備忘録)](https://qiita.com/miya1221/items/88a8751da147bcaa7be5)
“`posts_controller.rb
def destroy
current_user.comments.find(params[:id]).destroy!
flash[:notice] =

元記事を表示

「rails6 論理削除 実装」と調べたあなたへ

## はじめに

今現在、私はとあるプログラミングスクールにて日々奮闘中の身でございます。 
きっといま、あなたは何かしらの開発の段階で論理削除という言葉を知り、実装方法を
模索していることかと思います。

かくいう私も、現在プログラミング学習の毎日で、なにかすばらしいスキルをや機能を
ご紹介できると言われるとまだまだです。ですのでこれは自分自身の備忘録も兼ねております。
よってまだまだ未熟のため間違っている点や不適切な表現があるかもしれませんがご容赦
いただきたいと共に、なにかご助言をいただければ幸いです。

とはいえ、あなたのお困りごとのなにか一助になれれば幸いと思いこの記事を
書くことにしました。

## 前提条件

・deviseを用いての何かしらの開発経験がある方
・論理削除の一例を知りたい方
・論理削除のためのgem( [`paranoia`](https://github.com/rubysherpas/paranoia)や[`discard`](https://github.com/jhawthorn/discard)など)を使用しない方法を知りたい方
(また、今回

元記事を表示

細かいつまずいたことをメモしておく(2月編)

# はじめに

先月はAWSに力をいれて、デプロイについて学んだので今月は個人開発をはじめてみました。
Vueをほんのすこし触ったことある程度で何もわかっていないのでフロントの学習を含めて色々勉強しました。

# 問題

## 1. DockerのRailsコンテナがログ(logger, puts)を表示しない

以下の記事を発見して修正したところ表示された。

[【Docker】【Rails】MySQL8.0にしたらログが出力されなくなったので解決した話](https://jpdebug.com/p/1087438)

puma.rbで、標準出力が log/puma.stdout.log にリダイレクトされていたのが原因らしい。

“`config/puma.rb
# stdout_redirect “#{app_root}/log/puma.stdout.log”, “#{app_root}/log/puma.stderr.log”, true
unless ENV.fetch(“RAILS_ENV”, “development”) == “development”
stdo

元記事を表示

ActiveRecord で order しつつ find_each する

# 動機

大量のレコードを読み込んで処理をする場合、each を使ってイテレートすると、レコードを一括で取得するためメモリを大量に消費してしまう場合があります。そこで [ActiveRecord::Batches#find_each](https://api.rubyonrails.org/classes/ActiveRecord/Batches.html#method-i-find_each) を使ってバッチサイズ (デフォルトは 1,000 件) ごとにレコードを分割して読み込み、イテレートするのが常套手段ではないでしょうか。しかし find_each を使う場合、その仕組み上、リレーションの order 情報を無視して id の昇順[^1]に並べてイテレートすることになります。そこで、今回独自に order を保ったまま find_each する方法を用意しました。

# 方法

最初は ActiveRecord::Relation をオープンクラスやモジュールの prepend で拡張しようと考えましたが、方法ではそのサブクラス (Pokemon モデルに対する Pokemo

元記事を表示

コロナで大学を1年休学して、ソースコード売買プラットフォームを作りました

![root.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1195442/f47f3d34-455a-fd25-1b0e-2ddf66d4980a.jpeg)

# はじめに
プログラミングに興味を持ち出してから、調べれば調べるほどITのすごさに気付かされ大学の授業より実際会社で働いて世の中のITサービスがどのように作られているか知りたいと思い、インターンの求人を長いこと探していました。そして運よく一社だけ面談をさせていただけることになり運よく採用していただきました。その瞬間に休学を決意しました笑
2021年2月から9月まで受託開発会社、9月から1月末まで自社開発会社でエンジニアとして働いていました。そこで得た知識の集大成となったWEBサービスになります。

https://softpick.net/

# 制作物
プログラミングのソースコード売買プラットフォーム

### 何ができるか
・優秀なエンジニアが書いたソースコードを購入することができます。また、自分が作っているサービスと似ているソースコー

元記事を表示

【Rails】nil? empty? blank? present? exists?メソッドについて【Ruby】

## はじめに
 本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## nil? empty? blank? present? exists?メソッドについて

### nil?
対象がnilの時は`true`をそうでなければ`false`を返します。
nilは「何も存在しない」状態です(nullと同じ)。

“`ruby:trueを返す例
sample = nil
p sample.nil?
# true
“`

“`ruby:falseを返す例
sample1 = “”
p sample1.nil?
# false

sample2 = 0
p sample2.nil?
# false

sample3 = []
p sample3.nil?
# false
“`

### empty?
empty?メソッドは対象が空の文字列や空の配列の場合に`true`を

元記事を表示

sendメソッドメモ

RailsコンソールでRubyのオブジェクトに対してsendメソッドを実行し、配列の長さを得るとします。

“`
$ rails console
>> a = [1, 2, 3]
>> a.length
=> 3
>> a.send(:length)
=> 3
>> a.send(“length”)
=> 3
“`

このときsendを通して渡したシンボル:lengthや文字列”length”は、いずれもlengthメソッドと同じ結果になりました。つまり、どちらもオブジェクトにlengthメソッドを渡しているため、等価なのです。もう1つ例をお見せします。データベースの最初のユーザーが持つactivation_digest属性にアクセスする例です。

“`
>> user = User.first
>> user.activation_digest
=> “$2a$10$4e6TFzEJAVNyjLv8Q5u22ensMt28qEkx0roaZvtRcp6UZKRM6N9Ae”
>> user.send(:activation_digest)
=> “$2a$10$4e6TFzEJ

元記事を表示

【rails】登録日の表示について

はじめに

今回はdeviseというgemを使った環境だったのでcreated_at(登録日)というカラムが最初から入っていました。
なのでそれを使います。

結論

“`rails:index.html.erb

登録日
<%= current_user.created_at.strftime('%Y/%m/%d') %>

“`
こちらのコードを表示させると

![スクリーンショット 2022-02-26 21.26.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1340036/5d8deea6-d92f-adfb-8b29-5e36e878899e.png)

こうなります!

注意点

ログイン(新規登録)してからじゃないと、current_userがエラーを起こしますのでご注意を!

元記事を表示

MVCの説明わかりやすく、、、

MVCの仕組みについて簡単な説明を

色んなサイトを見てわかりやすい説明とわかりにくい説明がちらほら。

自分も得意ではありませんが、自分なりに少し時間をとって自分なりにわかりやすく説明を作ってみました。

アウトプットするので参考になればと思います。


「MVCとは、アプリケーション全体のコードを機能ごとに分けて整理、管理するための概念です。
役割ごとに機能をセットすることで、可読性や保守性の高いコードを維持することができます。

MVCは3つに分けた各機能の頭文字であり、
「M」は「MODEL」の略で、データ管理の役割を持つシステム本体となる部分です。
ユーザーからのアクセスによって促された処理を、データベースにアクセスし操作・参照しまたは変換してビューに表示します。

「V」は「VIEW」の略で、クライアント側にデータを表示します。

「C」は「CONTROLLER」の略で、クライアント側とビュー・モデル側との橋渡し役になります。
ユーザーが入力した情報に基づいて、モデルへは必要に応じてデータを取り出す指示を、ビュ

DBパフォーマンスを意識したRailsの書き方まとめ

# DBパフォーマンスを意識したRailsの書き方まとめ

Railsではデータセットが巨大化したときのデフォルトのパフォーマンスがかなり低下するケースがあります。

そんなときに気をつけた方が良いポイントを記載します。

## 1. N+1
N+1は簡単に言うと必要以上に SQL が走るせいでパフォーマンスが低下する問題です。

### 悪い例

“` ruby: tweets_controller.rb
class UsersController < ApplicationController def index @tweets = Tweets.all end end ``` ``` ruby: index.html.erb <% @tweets.each do |tweet| %>
<%= tweet.user.name %> # ここでN+1が起きている
<% end %>
“`
この書き方だと、tweetsの数だけSQLが発行されるのでパフォーマンスが落ちます。

### 良い例

“` ruby: tweets_controller.rb
c

AとBが同じではない時について(if 文)

簡易的なフリマアプリを作成中。

全てのコードを書き終えて、最終挙動確認を実施。

「自分の出品商品以外の商品には編集ページへ遷移しない」という挙動を確かめるため、直接URLに`/edit`を入力。
すると、意図と反して編集ページに移ってしまう。

該当するソースコードを確認。

“`ruby:controllers/item_controller.rb
private
def move_to_index
if !user_signed_in? && current_user.id == @item.user.id
redirect_to root_path
elsif @item.order.present?
redirect_to root_path
end
end
“`

よく見てみると`!`の位置がおかしい。
これだと「ユーザーがログインしていない時、かつログイン中のユーザーIDと出品した商品のユーザーIDが同じ時」というめちゃくちゃな日本語に笑
※「ログインいしていない時、かつログイン中」という矛盾が生じている

Ruby on Rails 7 with Bootstrap on Docker Compose 開発環境を簡単に構築する方法

## 対象読者

この記事は「 そろそろ Rails 7 触ってみようか 」と思っていて、Docker を扱える( あるいは、使いたいと思っている )人などを、主な対象としています。

これから開発を始めていく「 スタートライン 」として、参考にしていただければ幸いです。

## 動作環境

適当に「 MacBook Pro (13-inch, M1, 2020) 」に Docker をインストールしただけなので、Docker 環境さえ整っていれば、基本的には、どこでも起動できるはずです。

“`
% brew list –cask –versions | grep docker
docker 4.5.0,74594
“`

“`
% docker -v
Docker version 20.10.12, build e91ed57
“`

“`
% docker-compose -v
Docker Compose version v2.2.3
“`

## まず、五つのファイルを作ろう。

実は、公式ドキュメントに「 クイックスタート 」が( Rails 5 向けに )

Rails6とaxiosを連携させてデータを受け渡す!

## 実現したいこと
フロントエンドのデータをバックエンドに渡したい!

↓詳しく↓

JavaScriptのデータを[axios](https://github.com/axios/axios)を用いてDBに保存したい!

## 開発環境&前提条件
Ruby 3.0.2
Rails 6.1.4.4
データを保存するDBテーブル等は作成済み

## 1. axiosの導入

**インストール**
“`terminal:ターミナル
$ npm install axios
“`

**CDN**
“`html:任意のファイル

“`

## 2. Javascriptへaxiosの記載

“`javascript:任意のJSファイル
// ↓受け渡したいデータを格納
const data = { score: gameScore, user_id: “<%= current_user.

【Rails】クラスメソッドとインスタンスメソッドの使い分け

## はじめに
 本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。
 そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。
 間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。

## クラスメソッドとインスタンスメソッドの使い分け

### クラスメソッドとインスタンスメソッドの違い
クラスメソッドとインスタンスメソッドの違いは

– メソッドの記述方法
– メソッドの呼び出し方法

です。

#### メソッドの記述方法
クラスメソッドの場合には以下のようにメソッド名の頭に`self`を記述します。

“`ruby
def self.exists_no_name_user?
no_name_user_list = User.where(name: nil)
no_name_user_list.exits?
end
“`

インスタンスメソッドの場合には以下のように`self`のない形になります。

“`ruby
def full_name

ActiveJob でジョブのメモリ使用量がしきい値を超えた場合に通知する

# やりたいこと

– ActiveJob でジョブのメモリ使用量がしきい値以上だった場合に通知したい。
– 僕の具体的なユースケース: Sidekiq で大量にメモリを使用して、かつ解放されない場合が結構ある。そこで、具体的にどのジョブが関係しているのかを調べたい。

# 方法

– [around_perform](https://api.rubyonrails.org/v7.0/classes/ActiveJob/Callbacks/ClassMethods.html#method-i-around_perform) メソッドを使う。
– 今回は [Rollbar](https://rollbar.com) というエラーモニタリングサービスで警告を通知する。
– Rollbar.warning の部分は、環境に応じて任意の通知方法に置き換えること。

“`app/jobs/application_job.rb
class ApplicationJob < ActiveJob::Base around_perform do |job, block| Mon

AWSのS3で画像が保存できない

簡易的なフリマアプリを作成中。

AWSのS3に画像を保存するための実装を実施。
必要なファイルや記述なども終え、まずローカル環境で画像がS3に保存できるかの挙動確認を行う。

が、__エラー発生。__

エラー文は以下の通り。

“`
NoMethodError (undefined method `upload’ for nil:NilClass):
“`

「スペルミスでもしたかな?」

まずは今回新たに追記した`config/environments/development`と`config/storage.yml`のファイルを見直す。
しかし特に間違っている様子はない。

次にエラー内容をgoogleにて検索。
すると、同じ境遇の方々がたくさんいらっしゃいました笑
それぞれの記事を見ていると「:が抜けている」や「””を忘れている」などの内容が多かったので、再度その辺りを確認するため、各コードを見直し。
が、やはり間違いが見当たらない・・・

S3に入る直前に挙動確認を行った際は、問題なく画像が保存されていたので、コードの書き間違いは考えにくい。
間違いがあるのはcon

【RSpec】テストコードはループを使わない方がベター

# なぜループ処理を使わない方がいいのか

テストコードは仕様がひと目でわかることが大事なため、可読性が下がるループはしない方がベター

“`ruby
describe ‘#format_date_of_birth’ do
it ‘生年月日を和暦で表示すること’ do
%w(1977-06-06 1988-06-06 1989-06-06 2016-06-06).each do |date_text|
date = Date.parse(date_text)
person = Person.new(‘Taro’, date)
jp_year = date.year >= 1989 ? “平成#{date.year – 1988}年” : “昭和#{date.year – 1925}年”
expected = “#{jp_year}#{date.month}月#{date.day}日”
expect(person.format_date_of_birth).to eq expecte

AWSのEC2の環境構築で参考にしたサイト(rails,docker,nginx)

以下のインフラ環境を構築するまでに参考にしたサイトをご紹介します。

# 1,AWSの全体的な知識を付けるために参考にしたもの
<動画教材>
WEBエンジニアの山浦さんのUdemyの動画教材です。
解説が初心者に優しく、わかりやすいのでおすすめです。

https://www.udemy.com/course/aws-and-infra/

<書籍>
解説がわかりやすいです。
イラスト使って説明してくれるので、なにをやっているのかイメージしやすく、すぐに読み終えることができました。

https://www.amazon.co.jp/Amazon-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=sr_1_15?__mk

「Herokuで画像表示できない」を解決

# はじめに
 現在オリジナルアプリの開発中です。Heroku環境でアプリをアップロードしているのですが、assetsに配置した画像が表示されないという問題がありました。解決方法がわかったのでまとめておきます。

# 問題
 app/assets/images 配下に設置した画像が表示されない。(ローカル環境では表示されている)

ローカル環境では表示されているため、本番環境では追加の設定がいるのかもしれない。と思い調べると解決方法が出てきました。

# 解決方法
 解決方法は image_tagのファイルの指定方法を修正することでした。

“`qiita.rb
<%= image_tag "/assets/top.png" ,class:"img-fluid" %>
“`

image_tagに渡す画像のバスの指定方法を間違えていました。
この書き方では、ローカルだと表示されるのですが、本番環境だと表示されません。

以下に修正しました。

“`qiita.rb
<%= image_tag "top.png" ,class:"img-fluid" %>
“`

結果無