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

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

商品がない場合は以下のダミー商品が表示されるようにする

結論
if文を使う
“`ruby
#空でなければ表示する
<% if @items[0] != nil %>

#空の場合表示する
<% if @items.length == 0 %>
“`

元記事を表示

【RSpec】Capybaraシステムテストで要素クリックが失敗したら確認したいこと

## 概要
Ruby on Railsで開発したアプリのシステムテスト実行時に、Capybaraの使い方で少し躓いた点を書いた記事です。

html要素をクリック出来ずにテストが失敗した原因と解決方法を簡単にまとめました。

もし、同じ内容でテストに失敗した方のご参考になれば幸いです。

## テスト概要
– ハート文字をクリックするといいね/いいね解除できること

今回開発したアプリにはいいね機能を実装しており、ハートをクリックすることでいいねといいね解除ができるようにしました。

## テスト・エラー詳細

下記コードを実行。
“`ruby
RSpec.describe ‘Comments’, type: :system do
# 投稿をいいね・いいね解除できる
it ‘user can like the post’ do
click_link ‘♡’
expect(page).to have_button ‘♥’

click_link ‘♥’
expect(page).to have_button ‘♡’
end
end
“`

元記事を表示

fixture_file_uploadメソッドを使用してテストコードを書く

# Formオブジェクトを導入してテストコードにエラーが出た

テストコードを打ち込む際にエラーで悩まされていたのですが、Formオブジェクトを導入すると以下のように
fixture_file_uploadメソッドを使用しないと行けないという事が分からずに時間をかけてしまいました。
以前はafterメソッドを使用してダミー画像をFactoryBotで用意していたのですが
“`ruby:FactoryBot
after(:build) do |item|
item.image.attach(io: File.open(‘public/images/test_image.png’), filename: ‘test_image.png’)
end
“`
Formオブジェクトを導入すると上記の方法ではダミー画像を使用できませんでした。

# fixture_file_uploadメソッド

調べてみると下記のようにRSpecにfixture_file_upload(該当ディレクトリの画像ファイル)を使用して
インスタンス変数に代入すると良いと言うことで試してみた所無事解決しました。

元記事を表示

“Could not find [gem name] in any of the sources”のエラーが出たときの対応

# サービス環境
ruby 2.6.8
Rails 6.1.5
docker

# “Could not find [gem name] in any of the sources” 

Railsでツイッターのクローンの課題でOmniauthを使ってgit hubのアカウントでログインできる機能を作ろうとしましたが、Railsコマンド実行時に`”Could not find [gem name] in any of the sources”`のエラーが出ました。
**お前が使おうとしているgemどこにもないやねん!** と怒られましたね。w
# 原因
`gemfile`の周りが怪しいと思って、`Omniauth gem`の各依存を調べたりして色々試してみましたが、解決できませんでした。
それで、疑惑の領域を広げて、Railsのコマンドの周り、`docker-compose`のコマンド等について調べた結果、やっと原因がわかりました。

原因は`Docker-compose.yml`ファイルでした。
課題を始める時に、Dockerの学習が終わった段階だったので、
`Dockerfile`

元記事を表示

【初学者】Rails、Next.js、Auth0のアプリケーションで、Access Tokenを利用して、バックエンド側(Rails)でメールアドレス(email),ユーザ名(name),アイコン(picture)を取得する方法

[こちら](https://qiita.com/KNR109/items/ca48c2578cc891674575)の記事を参照して、アプリを作成しておりましたが、
バックエンド側で認証したユーザのユーザ名とアイコンを取得しようとした際に、
ちょうど良い記事が見つからず手間取ったので、メモも兼ねて投稿いたします。
初学者のため、誤り等があればご指摘ください。

### やりたい事
Access Tokenに、ユーザ名、アイコンのデータを付与することで、Rails側でデコードした際に、ペイロードからその情報を取得できるようにする。
下記のチュートリアルでいうとverify_tokenのところで取得できるはず。

https://auth0.com/blog/building-secure-apis-with-rails-6-and-auth0/

### 手順① Auth0のRulesを開いて、Createを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710784/53768ec

元記事を表示

.ruby形式のビューを活用する

RailsのビューをRubyで書く、`.ruby`というものの存在を知ったので、少しまとめてみます。

## ビューの二重拡張子

Rails de使うビューには、`index.html.erb`とか`show.json.jbuilder`のように、二重の拡張子が付与されています。このうち、前半の`.html`や`.json`は、レスポンスの形式を表すものであり、後半の`.erb`や`.jbuilder`は、テンプレートを処理するハンドラーの指定です。

ここで言及する`.ruby`も、そんなハンドラーとして使えるものです。

## 使い方

他のビューと同じように、`app/views/controller_name/action_name.response_extension.ruby`のようなビューファイルを作成して、その中には好きにRubyコードを書けます。

そして、出力は、メソッドを書く時と同様な感じで、ビューファイルの最後の行で実行した内容となります。

## メリット

Railsの出力を構築する方法としては、「他のハンドラー形式を使用する」「`render`や`sen

元記事を表示

N+1問題をincludesメソッドで解決

N+1問題とは、アソシエーションを利用した場合に限り、データベースへのアクセス回数が多くなってしまう問題のこと。
“`ruby
モデル名.all
“`
としてしまうと、N+1問題にひっかかる。
それを解消するためにincludesメソッドがある。
“`ruby
モデル名.includes(:紐付くモデル名)
“`
と書けばよい。

例:フリマアプリ
“`ruby
class ItemsController < ApplicationController def index @items = Item.includes(:user) end ``` で、ビューでeachメソッドを使ってインスタンスを取り出す。 ```ruby app/views/items/index.html.erb <% @items.each do |item| %>
<%= item.text %>
<%= item.name %>
<% end %>
“`

元記事を表示

ファクトリーボットにアクティブストレージを記述する。

 モデルの単体テストを行う場合、ファクトリーボットにテスト項目を載せるわけだが、アクティブストレージを使用した際にどうやってテストを行ったか書いておこうと思う。
① ![スクリーンショット 2022-10-27 13.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/67bf33d8-4c5a-137e-8395-28bdf7d66735.png)
こんな感じで、fixturesフォルダを手動で作成し、その下にfilesフォルダを作成する。
② filesフォルダに、なんでも良いのでtest_image.jpgという名前で画像を配置する。
③ Furima>specmodel>item_spec.rbに以下のように記述。
“`ruby
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
@item.image = fixture_file_upload(

元記事を表示

ファクトリーボットにアクティブハッシュを設定する

 ファクトリーボットにアクティブハッシュを設定する場合どうしたらよいのかわからなかったので記録。
前提として、作成しているのはフリマアプリで、ユーザーモデルとアソシエーションを組んでいる。
 なのでファクトリーボットにもアソシエーションの記述を忘れずに。
 結論からいえば、ファクトリーボットにそのまま〜_idと書いてよいようだ。
ただし、{}の中身は1にすると—がでてしまうので、1以外で。
いつかはフェイカーをつかってもっと一般的に表せるようになりたい。

“`ruby
FactoryBot.define do
factory :item do
product_name { “てすと” }
product_description {‘test’}
price {1000}
category_id {2}
condition_id {2}
contribution_id {2}
prefecture_id {2}
day_id {2}

association :user
end
end
“`

元記事を表示

WEB開発をやり始めてみる(Rails:Cloud9環境設定)

# 目的
Railsの環境を整えるのをCloud9上でやってみます。
# やったこと(環境整備)
“`ruby:
$ rails -v
Rails 7.0.4

$ mkdir rails_projects
$ cd rails_projects/

### railsを新しく作成
$ rails _7.0.4_ new hello

### gemファイル内読み込み
$ bundle install
“`
# やったこと(簡単なものの表示)
“`ruby:
### Usersはコントローラーの名前
### indexはメソッドの名前
$ rails g controller Users index
“`

“`ruby:app/controllers/users_controller.rb
### 上記で作成したUsersコントローラーが作成されています(ApplicationControllerを参照しています)
### indexメソッドが作成されています
class UsersController < ApplicationController def inde

元記事を表示

[Rails] eager_loadでN+1問題を解消し関連レコードを含んで一覧表示

## はじめに
ポートフォリオ作成中の学びを記載します。
記事を読んでいただくことで次の2点をお伝えできると思います。
– eager_loadによるN+1の解決
– scopeによるクエリ文の可読性向上

## やりたいこと
複数の開催日をもったイベント情報一覧を表示したい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1754248/1b9bb117-8162-eb2a-5a67-2b015fcecfb4.png)

### 動作環境
Ruby: 3.1.2
Ruby on Rails: 6.1.7

### 関連の確認
アソシエーションは次の通りです。
“`plantuml
@startuml yonde
hide circle

skinparam linetype ortho

entity “events” as events {
id

title
discription
is_published
created_at
updated_a

元記事を表示

Rails7にpostCSSを導入する

# 前提
– 事前にyarnのインストールが必要
どうやら「Rails new」時に、`postcss`や、`esbuild`が「yarn」を使用してインストールされる模様
※別にnpmでいいや〜の私はこのせいで少し戸惑った?

## プロジェクトの作成
“`bash
rails new . -j esbuild -c postcss
“`
– jオプションで`JavaScript`のビルダー指定
– cオプションで使用するCSSフレームワークに`postCSS`を指定

色々インストールされる(適当)

### package.jsonにscriptsが登録
`yarn` + 以下のコマンドで、ビルド処理が可能。
– `yarn build` => JavaScriptのバンドル
– `yarn build:css` => CSSファイルのバンドル処理

但し、Rails7には`bin/dev`コマンドが用意されているため、こちらを使用するのが一般的。
(CSS,JSの変更を検知して、自動でビルド処理してくれる優れもの)

`gem “jsbundling-rails”` と `

元記事を表示

【Rails】背景画像を本番環境でも表示させる方法(background-image: image-url)と注意点

# はじめに
備忘録で書いてるので間違いがあってもご容赦下さい。
むしろ指摘していただけると助かります。

# 環境
Rails 6.1.x 

# やりかた
対象となる背景画像を hogehoge.jpgとした場合
`/app/assets/images/hogehoge.jpg` のpathで配置する。

`app/assets/stylesheets/application.scss` に対してimage-urlを使う。

“`app/assets/stylesheets/application.scss
background-image: image-url(‘hogehoge.jpg’);
“`

こうすることで、
developmentでは `app/assets/images` 配下の対象ファイルを、
productionでは `public/assets`配下の「アセットパイプラインによってプリコンパイルされた対象ファイル」を取りに行く。

# 注意点
`image-url` は
app/**assets**/stylesheets/application.

元記事を表示

【Rails】Twitterクローンを作ってみた 〜ユーザー詳細ページの作成〜

## はじめに
[【Rails】Twitterクローンを作ってみた 〜ログイン周り編〜](https://qiita.com/bloom__fu/items/d005686cbdaa83d2c0c2)の続きです。ログイン周り編を前提に進めていきますので、まだご覧になっていない方はそちらからご覧ください!※こちらはdockerでの環境構築を省きます。
## サービス環境
– ruby 3.0.0
– Rails 6.0.4
– docker
– mysql 8.0.2
– Slim, SCSS

## ユーザー詳細ページの作成
#### 条件
– トップページの「つぶやく」の上にある自分の名前をクリックするとユーザー詳細ページに飛ぶ
– 自分のプロフィールを編集できる
– 退会ボタンから退会することができる
ユーザーのプロフィールの内訳は名前、自己紹介文、プロフィール画像とします。プロフィール画像に関しては後のセクションでやるのでまだこのセクションでは編集できなくて良いです。ユーザー退会はユーザーを実際に削除するのではなく論理削除してください。
#### 実装流れ(簡略)
① Userモ

元記事を表示

単体テストコードで重複したメールアドレスを通さないようにする

重複したメールアドレスについて単体テストコードでつまづいたので記録。
ファクトリーボットでインスタンスを作成したあと、
セーブメソッドで保存。
あとは記述の通り。

“`ruby
it “重複したメールアドレスは登録できない” do
@user.save
another_user = FactoryBot.build(:user)
another_user.email = @user.email
another_user.valid?
expect(another_user.errors.full_messages).to include(‘Email has already been taken’)
end
“`

元記事を表示

【エラー解決方法】Rails7:ActionDispatch::Request::Session::DisabledSessionError

# 概要
– https://qiita.com/kazama1209/items/caa387bb857194759dc5
上記の記事でログイン機能を作成したのですが、ログイン画面からユーザーを「ID」と「パスワード」により認証するパスワード認証はできたのですが、リロードした際のトークン認証がうまくいきませんでした。

### エラー内容
“`Ruby
api_1 | app/controllers/api/v1/auth/sessions_controller.rb:3:in `index’
api_1 | Completed 500 Internal Server Error in 19ms (ActiveRecord: 2.7ms | Allocations: 684)
api_1 |
api_1 |
api_1 |
api_1 | ActionDispatch::Request::Session::DisabledSessionError (Your application has sessions disabled. To w

元記事を表示

TimeWithZoneクラスについて

## 環境
Ruby2.6
Rails5.2

## はじめに
Railsでシステム日付を取得する場合は、Ruby標準のTimeメソッド、Dateメソッドは使わずに、Railsで用意されている、TimeWithZoneクラスを使うことになります。

TimeWithZoneクラスはActive Supportの拡張メソッドです。Ruby標準のTimeメソッド、Dateメソッドを使ってシステム日付を取得すると、OSが持っている日付がそのまま取得されるのに対し、TimeWithZoneクラスを使うと、OSのシステム日付がどうであれ、config/application.rbで設定しているタイムゾーンに該当する日付に変換して取得してくれます。

例えば、OSのタイムゾーンがUTC(協定世界時)である場合、Ruby標準のメソッドを使うと、UTCの日付がそのまま取得されます。しかし、TimeWithZoneクラスを利用すると、OSのタイムゾーンがUTCであっても、Railsで下記の設定をしている場合、JST(日本標準時間)に変換して取得してくれます。
“`config/application.

元記事を表示

rubyzipを用いて、一時退避させたファイルをzipに圧縮し送信する

# やりたいこと
rubyxlで編集したエクセルファイルを数十個出力し、それらをzipファイルで圧縮しsend_dataで送信したい。

# 使用するgem
https://github.com/rubyzip/rubyzip

Gemfileに以下を記入し、bundle installを実行します。
“`
# zipファイル作成
gem ‘rubyzip’

“`

# 使用例
複数箇所で使用したかったので、moduleにしました。
“`
# zipファイルを作成

require ‘rubygems’
require ‘zip’
# windows文字化け対策
require ‘nkf’

module CompressFilesToZipService
module_function

def call(filenames, folder, zipfile_name)
Zip::File.open(zipfile_name, Zip::File::CREATE) do |zipfile|
filenames.each do |filename|

元記事を表示

エンティティの洗い出し

 最近フリマアプリを実装するにあたってエンティティの洗い出しとER図、readmeを書くのにめっちゃ時間かかったので復習。
 結論からいうとER図はこんな感じになった。
![スクリーンショット 2022-10-26 9.39.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884270/3c3285f3-f061-b9a2-ee60-6c9bba870c92.png)

 フリマアプリのER図を書く時に一番困ったのは、中間テーブルの存在。
自分の浅い認識では中間テーブルというのは多対多のテーブルの関係の間にはさまってるイメージだったけど、今回は出品情報を一旦まとめるテーブルと、受け取り先をまとめるテーブルを作って、その間を取り持つような形になった。
 ユーザー情報はdeviseをつかって。あとでバリデーションとか設けるときにメールアドレスとパスワードはdeviseの使用で勝手に記述されるので、二重記述にならないように注意。
 で、テーブルの設計はこうなった。
![スクリーンショット 2022-10

元記事を表示

ログインユーザーのみコメント/投稿ができる機能を実装

前提条件

ログインしたユーザーのみがコメント/投稿できるように制限をかけてみたいと思います。

♦︎投稿機能、コメント機能、ユーザー機能が実装済みである
♦︎Gem ‘devise’を導入している
上記を前提条件として記述していきます!

ポイントは”user_signed_in?”メソッド

user_signed_in?メソッドとはなんぞや。まあ読んだままのメソッドで、
ユーザーがサインインしているかどうか判定してくれます。
ヘルパーメソッドの一種ですが、こちらは前提条件で示しているように、
deviseを導入していることで使えます。
※もしuserではなくて、customerやmemberを使用している場合は
それぞれの仕様に書き換えてください。

コントローラーを書き換える

“`ruby:app/controllers/comments_controller.rb
def create
if user_signed_in? ①
post = Post.find(params[:post_id])

元記事を表示

OTHERカテゴリの最新記事