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

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

ActiveStorageでRspec実行時に生成された画像データをテスト終了後自動で削除する方法

## 概要
`ActiveStorage`で`Rspec`実行時に生成した画像ファイルをテスト終了後に自動で削除する方法をメモとして残しておきます。
`Rails`で`Rspec`を用いてテストする際に画像を生成する場合があると思います。
その際に生成されたテスト用画像データは下記のように`config/storage.yml`に設定された保存先に保存されます。

“`ruby
test: # ‘root’にテスト時に生成された画像を保存する場所を指定している
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
“`
テストを行っていくとどんどんと保存先のストレージが生成された画像で圧迫されてしまいます。
しかし、ある設定をすることでテスト終了後はストレージをクリーンアップすることができます。

## 方法
_*spec/rails_helper.rb*_

“`ruby
RSpec.configure do |config|
config.after(:all) do
FileUtils.rm_

元記事を表示

slimの使い方

# slimとは
***Rubyのテンプレートエンジン***のことです。
erbとかあると思いますが、slimを使うと書く手間が省けて、
htmlより簡潔に書くことができます。

# erbとの書き方の違い
slimの書き方の特徴を表にして行きます。

|<>|これは使わない|
|–|–|
|<% %>|= |
|<% %>| – |
|コメント| / |
|id指定|#|
|class指定|.|

このように表記して行きます。

コードで表すと下のようになります。

“`.html

slim練習

slimテスト

“`
slimにするとこうなります。

“`.slim
h2 slim練習
.content
p slimテスト
“`
書き方としてはかなりシンプルになります。

具体的に表にしてみます。

|html(erb)|slim|
|–|–|
||/|
|class=”content”|.content|
|id=”content”|#content|

元記事を表示

link_to 〜 doの役割

実務でタイトルにあるような書き方を見たので、まとめようと思います

link_toの使い方は、ご存知かと思います。もし分からないという方がいらっしゃいましたら、[公式ドキュメント](https://railsdoc.com/page/link_to)を読んでみてくださいね!

## link_to doはいつ使われるのか
下記のコードのようなときにこのメソッドは使われます
“`
<%= link_to root_path, class: "btn btn-link" do %>

メッセージ
<% end %>
“`
このように、画像を押すと指定したパスに遷移するような実装をしたいときに使えるかとおもいます。
公式ドキュメントを見ると分かるとおもいますが、link_toの引数に画像を指定することはできないんですね。
そこで、画像を押したときに指定したパスやURLに遷移するような実装をしたい時に、このメソッドが使えるんです。

短いですが、以上です

元記事を表示

cannot load such file — gemname (LoadError)

# Gemfileに無いgemをrequire

Gemfileに書いていないGemをrequireしていた。

“`
gem list
“`

でlocal gemにあるからと言って、大丈夫と思ったのですが違ったみたい。

もし、Gemfileにないが、localにあるgemを使いたいなら、
pathを$LOAD_PATHに書く必要がある様です。
(多分Qiitaでどなたかが書かれた記事を見たがURLを失念。)

今回はGemfileに入れたいgemだったので、
Gemfileに記入して完了。

元記事を表示

三項演算子まとめた

# 三項演算子とは

if ~ else ~ を1つの文で書くときの演算子。
Rubyなどでコンパクトな表現に置き換えられる。
ternary operatorともいうので3つのものを1組にして動かすってイメージ。

“`
論理値(条件式) ? 何かをする(条件式a) : 別のことをする(条件式式b)
“`

論理値(条件式)を評価して結果が真なら 何かをする(条件式a), 偽なら 別のことをする(条件式式b)を評価してその結果を値とする。

# 少し細かく

“`
if 論理値(条件式)
何かをする(条件式a)
else
別のことをする(条件式式b)
end
“`

“`rb
if boolean?
var = foo
else
var = bar
end
“`

“`rb
var = boolean? ? foo : bar
“`

それとメソッドの戻り値として使うこともよくあるみたい。

“`rb
def foo
do_stuff
boolean? ? “bar” : “baz”
end
“`
Rubyでは暗黙

元記事を表示

Ruby on Rails Zeitwerkについて

## はじめに
通常のRubyでは、親要素を継承した子要素を定義する(依存関係のある)場合はファイルをrequireして、明示的に読み込む必要があります。しかし、Railsでは、親要素のファイルをrequireせずに継承しているものがあることに気づいたので、そのことについて調べてみました。

~~~ruby
#rubyでは、本来以下のような記述が必要だが、rails では不要。
#require ‘/application_controller.rb’
class UsersCotroller < ApplicationController ・・・ end ~~~ ## 結論 Rails 6.0以降は、Zeitwerkモードでの自動読み込み(オートロード)および再読み込みの仕組みにより、requireせずとも、ファイルが自動読み込みされている。 ## Zeitwerkとは Ruby用に作成されたコードローダーの仕組み プロジェクトで定義されたクラスやモジュールを必要な時(autoloding)もしくは、事前に一括で(eager loading)読み込みます。 #### フ

元記事を表示

devise ユーザー情報変更をcurrent_passwordなしで行う。

## はじめに

Deviseのデフォルトの状態だと、ユーザーのアカウントをアップデートするには、current_passwordが必要です。
ただ名前やメールアドレスといった基本情報の編集のたびにパスワードを入力させるのは、UIの面を考慮するとあまりよろしくないです。そこで、現在のパスワードを入力しなくてもプロフィールの情報を編集できるように実装します。また、パスワードを変更する場合は、現在のパスワードを入力するような仕様にします。
![スクリーンショット 2022-02-28 0.13.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653944/e7349a0b-db4c-19ba-3d73-97123bc62ca0.png)

## Devise::RegistrationsController#updateの実装について
Devise::RegistrationsController#updateでは、以下のとおり、Devise::RegistrationsController#upda

元記事を表示

【Rails】Active Jobのテストの書き方

# 初めに

Active job のテストは E2E テストですることができますが、job 単体のテストをしたい時に書き方がわからなかったのでここに残しておきます。

## やりたい事

job 単体のテストを書く

## 環境

Ruby 2.7.4

Rails 6.1.3

Rspec 3.10.1

# Job テスト

まずは、spec ディレクトリの下に jobs ディレクトリを作成します。
そして、テストしたい job のスペックを作成します。

“`console:コンソール

/rails # mkdrir spec/jobs

/rails # touch spec/jobs/_job__spec.rb

“`

job がキューに入ったことの確認するテストと job が実行されているかのテストを書きます。
DeleteReviewJob は review を削除する job です

“`ruby:rails/app/jobs/delete_review_job.rb
class DeleteReviewJob < ApplicationJob

元記事を表示

mysql5.7での所有権エラーを直そう!!

# rails でmysqlを使ったらエラー出た。。

“`
Mysql2::Error::ConnectionError (Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)):
ERROR! The server quit without updating PID file (/usr/local/var/mysql/**.local.pid)
“`
# 環境
MySQL : 5.7.37
macOS : 10.14.6
ruby : 2.7.2
rails : 6.0.3

![mysql.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1385887/c415ecdf-9903-8e9e-7e07-4d1b44601273.png)

調べると、所有権に問題があるというので、ログインするため下のコマンドを試してみました。

## まずは、ログイン
“`console
mysql –

元記事を表示

画面遷移するとjQueryが動かないときはTurbolinksが悪さをしているかもしれない

**環境:**
Ruby 2.7.3
Rails 6.1.4.4
# **問題**
jQueryを使って、例えば「ボタンをクリックしたらモーダルウィンドウが表示される」といったアクションを実装したとする。すると、最初にページに訪れたときは正常に動くのに、ページ遷移を挟んだら動かなくなり、ページをリロードするとまた動き出す…といった不具合が発生する。

サンプルはこんな形↓(「open」というIDを持つオブジェクトをクリックすると、モーダルウィンドウが表示されるような処理)

“`jsx
$(function () {

$(“#open”).click(function(){
—–処理——
});

});
“`

# **原因**

**Turbolinksがjsの読み込みを邪魔している。**

まず、

“`jsx
$(function() {});
“`

1行目のこれはコードの省略形で、正確に書くと以下のようになる。

“`jsx
$(document).ready(function {

//処理

});
“`

元記事を表示

【個人開発】匿名とニックネームを自由に切り替えれる機能をwebサービスに追加してみた

# はじめに
1か月前にLisdomという投稿サービスをリリースしました。

ゆるーく自由なサービスと謳っていたのですが、昨日、ニックネームとかプロフィールが公開されていたら投稿したりコメントするのに億劫になると友人からの意見、、、
どうしようかな~と考えていたら、切り替え出来たら便利じゃん!と思い、忘れないうちに実装するため、早速実装してみました。

# 匿名とニックネーム表示の切り替え機能
今までは、以下のように、投稿主とコメント主のプロフィール画像とニックネームが公開されていました。
![qiita2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503691/63cdce54-cacf-bea2-e74d-297ccbdc4333.png)

匿名希望さんのボタンをONにして投稿すると↓↓↓
![qiita9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2503691/519abcc1-bcec-2d61-

元記事を表示

【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がエラーを起こしますのでご注意を!

元記事を表示

OTHERカテゴリの最新記事