Rails関連のことを調べてみた2021年11月29日

Rails関連のことを調べてみた2021年11月29日

【Rails】本番環境でCSSで指定した背景画像が表示されない。。。の解消

## 環境
Rails 6.1.4

## やりたいこと
ローカルで正常に表示されていた背景画像が本番環境で表示されなかったことの解消

## 結論
SCSSファイル内の記述を次のように書き換えデプロイすることで正常に表示。

“`sass:app/assets/stylesheets/〇〇.scss
//修正前
background-image: url(‘bg-image.jpg’);

//修正後
background-image: image-url(‘bg-image.jpg’);
“`

## なぜ起こったのか?
アセットパイプラインのキャッシュの高速化と『digest』という仕組みが関係している。
上記によって、**デプロイ後のapp/assets以下のファイルは全てpublic/assetsに上記のdigest付きになって移動**され、参照できなくなったことにより発生したもの。

## 参考記事

https://railsguides.jp/asset_pipeline.html#production%E7%92%B0%E5%A2%83%E3%81%AE%E5%A

元記事を表示

Railsでbcryptエラー(cannot load such file — bcrypt)が出た時の対処法

【エラー内容】
パスワード暗号化のため、Gemfileにコメントアウトされていたbcryptを導入したところ、以下のエラーが発生しました。

“`
cannot load such file — bcrypt
“`

「bundle install」も実行しており、Userモデル内に「has_secure_password」を記述してもエラーが解消しませんでした。

【対処法】
Railsサーバーを一度停止し、再起動(rails s)する事でbcryptの内容が反映されました。
困ったらサーバーの再起動も試してみるべきですね。

元記事を表示

FactoryBot のまとめ

## **FactoryBot とは**

factory_bot_rails といった gem を導入することで使える。

→ model のデータに紐づいたテストデータを簡単に作るためのもの。

spec 配下の factories の中に定義する。

各モデルのファイルを作成して、カラムに基づくデータを Faker を使って定義する。

> Faker とは… ダミーデータを作るのに便利な gem のこと。
>

**定義したデータをテストの際などで呼び出すことが可能になる!**

## **FactoryBot の定義の仕方**

`FactoryBot.define`を`do 〜 end` の中で定義するような書き方をする。

作成例)

“`ruby
FactoryBot.define do
factory :article do
title { Faker::Lorem.word }
body { Faker::Lorem.sentence }
end
end
“`

上記のような書き方だと、
title カラムでは、`Faker::Lor

元記事を表示

【jbuilder】部分テンプレートのオプション

##環境
Ruby 3.0.2
Rails 6.1.4.1

##部分テンプレート

部分テンプレート内で呼び出し方を“`as“`で指定
2つとも同じように取れる

“`app/views/users/index.json.jbuilder
json.partial! ‘users/user’, collection: @users, as: :user

#or

json.array! @users, partial: ‘users/user’, as: :user
“`

“`app/views/users/_user.json.jbuilder
json.extract! user, :id, :name, :age
“`

##参考

https://github.com/rails/jbuilder

元記事を表示

【Rails】IN句の書き方

IN句の書き方いろいろ

“`ruby
User.where(id: [1, 3, 6])
#=> SELECT `users`.* FROM `users` WHERE `users`.`id` IN (‘1’, ‘3’, ‘6’)
“`

“`ruby
ids = [1, 3, 6]
User.where(‘id IN (?)’, ids)
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
“`

“`ruby
User.where(‘id IN (?)’, [1, 3, 6])
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
“`

“`ruby
User.where(‘id IN (1, 3, 6)’)
#=> SELECT `users`.* FROM `users` WHERE (id IN (1, 3, 6))
“`

元記事を表示

【Rails】Routingのネスト,member, collectionの違い

###はじめに
Railsでアプリケーション作成しております。
作成中にルーティングについて少々学習したので、自分用のメモとして残しておきます。

###ルーティングについて
ルーティングは、受け取ったHTTPリクエストに応じて、特定のコントローラー内のアクションを動作するように割り当てを行なっている。
Railsのルーティングは`config/routes.rb`で設定する。

“`ruby:config/routes.rb
Rails.application.routes.draw do
# ここにルーティングを設定する
root ‘home#index’
end

“`

設定したルーティングは、以下のコマンドを実行することで確認できます。

“`:ターミナル
$ bin/rails routes

Prefix Verb URI Pattern Controller#Action
root GET / home#index
“`
###実装したかったこと(前提)
ユーザー(user)が、ある施設(house)に口

元記事を表示

【Rails】SQLでor検索

A OR Bの結果が出力される。

“`ruby
User.where(name: ‘コナン’)
.or(User.where(email: ‘ran@gmail.com’))
#=> SELECT `users`.* FROM `users` WHERE (`users`.`name` = ‘コナン’ OR `users`.`email` = ‘ran@gmail.com’)
“`

orメソッドがまだなかったときはこんな書き方をよく見かけたらしい。

“`ruby
User.where(“name = ? OR email = ?”, ‘コナン’, ‘ran@gmail.com’)
#=> SELECT `users`.* FROM `users` WHERE (name = ‘コナン’ OR email = ‘ran@gmail.com’)
“`

元記事を表示

【Rails】複数レコード一括保存のRspecの書き方

https://ryucoding.com/programming/rails-form-bulk-create
で紹介されている複数レコードを一括保存するcreateアクションをテストするリクエストspecの書き方で詰まったのでその備忘録です。

#テスト対象のコントローラーとアクション

“`
//questions_controller
def create
@form = Form::QuestionCollection.new(question_collection_params)
if @form.save
redirect_to root_url
else
render ‘new’
end
end
.
.
.
.
.

def question_collection_params
params.require(:form_question_collection).permit(questions_attributes: [:content, :mode_num])
end

“`
クイズ出題ア

元記事を表示

【Rails】左外部結合と内部結合

##環境
Ruby 3.0.2
Rails 6.1.4.1

##前提条件
“`ruby
class Owner < ActiveRecord::Base has_many :dogs end class Dog < ActiveRecord::Base belongs_to :owner end ``` ##左外部結合 左側のテーブルにしかないレコードも取得して結合する。 下の例でいうと、飼犬がいないオーナーのデータも取得できる。 ```ruby Owner.left_joins(:dogs) => SELECT `owners`.* FROM `owners` LEFT OUTER JOIN `dogs` ON `dogs`.`owner_id` = `owners`.`id`
“`

##内部結合
結合条件に一致するレコードのみを結合する。
下の例でいうと、飼犬がいるオーナーのデータのみ取得できる。

“`ruby
Owner.joins(:dogs)
=> SELECT `owners`.* FROM `owners` INNER JOIN `do

元記事を表示

【Railsチュートリアル】ユーザー検索機能の実装

#はじめに

前回の記事[【Railsチュートリアル】いいね機能の実装](https://qiita.com/supyolo888/items/8c3beaf25811e0a98efb)に引き続きRailsチュートリアル第6版sample_appの機能拡張を進めていく。
今回は以下の様なユーザー検索機能を実装していく。
![スクリーンショット 2021-11-28 21.42.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2200191/e46fbcf8-1bb4-e26f-51d6-693bf2c71e12.png)

**前提**
第6版sample_appが完成している

#手順

Gemfileにransackを追加

“`rb:Gemfile
gem ‘ransack’
“`

検索フォームを作成

“`rb:app/views/users/_search_form.html.erb
<%= search_form_for @q do |f| %>
<%= f.label :n

元記事を表示

bundle installが原因でdocker-composeが立ち上がらなかった話

everyday-railsというテスト本を元にdocker環境で学習しようとしたのがことの発端です。
私自身dockerのことをよくわかっていなかったので、なかなか解決に時間がかかってしまいました。

# 前提
この記事では、docker-composeにrailsの環境(everyday-railsで用意されているソースを元に使います。)を構築するにあたって遭遇したエラーとその対処について書きます。

# Dockerファイルなど

### dockerファイル

“`docker:dockerfile
FROM ruby:2.7
ENV LANG C.UTF-8

RUN apt-get update -qq && apt-get install -y \
build-essential \
nodejs \
&& rm -rf /var/lib/apt/lists/*

RUN gem install bundler

WORKDIR /tmp
ADD Gemfile Gemfile
ADD Gemfile.lock Gemfile.lock
RUN bun

元記事を表示

「Ruby」where文で同じカラムで複数指定する方法

#where文で配列を同じカラムで複数指定する方法

変更前

“`
@q = Tweet.where(completed: “0”)
“`
変更後

“`
@q = where(completed: [‘0’, ‘1’])
“`
このように配列にすれば指定できる。

元記事を表示

kaminariの導入からオリジナルページネーションデザインを作成する

kmainariのページネーションデザインをどうするかを考えたことがあるかと思います。テンプレートもあるので手軽に作ることもできますがオリジナルがいいなと思ったので今回はその作り方をアウトプットしていきます。

作成するページネーション↓
![スクリーンショット 2021-11-28 14.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1645779/e524bf15-5e7e-7edc-d01c-aa5be8c405c6.png)

基本的にはstyleをあてるだけなので、もっとかっこいいものも作れますよ。

https://github.com/taiki-nd/kaminari-design

# アプリ作成
“rails _6.1.4.1_ new kaminari-design -d mysql“
“rails db:create“

# サーバーサイドの構築
scaffoldでサクッと作成していきます。
“rails g scaffold post title:stri

元記事を表示

【しくじり先生】失敗続きの未経験からのエンジニア転職1年間を振り返って最短で満足のいく転職をするにはどうすれば良いかを考えてみた

# はじめに
こんにちは、28歳未経験から12月より150名規模の自社開発企業で働くことになったもきおです。エンジニア転職を目指し2020年10月に前職を辞め、早1年も経ってしまいました。
仕事をしていながらなら分かるが学習にコミットして流石に一年は長かった。

1年間色々と細かい失敗を繰り返し続けました。でも失敗ばかりだったから伝えられることも多くあると思うんです。そこで今回は今までの流れを振り返りつつ、失敗から何を学びどのようにすればもっと早く満足のいくエンジニア転職ができるかを考えてみました。

書きたいことが多く結構なボリュームになってしまいましたが最後までご覧いただけますと幸いです。

# こんな人に読んで欲しい
・プログラミングスクールからエンジニア転職を目指している方
・独学からエンジニア転職を目指している方
・エンジニア転職活動をしている方
・これからプログラミングを学んでエンジニア転職を考えている方

#今までの流れ
まず初めに「おいもきお、一年も何やってたんだよ」と声が聞こえてきそうなので今までの流れをざっと表で振り返っていきます。

|期間|やったこと|
|–

元記事を表示

インチキをしてRailsでExcelを読み書きする

## Excel大好きな人達

多くの案件ではExcel好きなプロパーとかExcel好きなプロパーとかExcel好きなプロパーが跋扈しており、確固たる理由はないがなんとなく「Excelライクで」とか言われることが非常に多いと感じています。
Excelライクと言わないまでも、Excelをアップロードできたりダウンロードできたりと言った要件は、非常にカジュアルに生じています。

「DXの意味わかっているの?」と言いたくなるのですが、これが原状なのでしょうがありません。

## Railsライブラリの限界
ただ、Railsエンジニアなら一度は経験したことがあると思うのですが、RailsにはExcelをうまく扱えるライブラリがあまりありません。

|ライブラリ|機能|注記|
|-|-|-|
|Axlsx|新規作成から書き出しだけ|新規作成のみで、テンプレートファイルからの新規作成もできない。複雑なワークシートを作ろうと思うと、コードが恐ろしく読みにくくなる|
|Roo|読み込みだけ|読み込み専用|
|RubyXL|読み書き可能|数少ない読み書き可能なライブラリだが、`parse`が恐ろしく遅い

元記事を表示

【Railsチュートリアル】いいね機能の実装

#はじめに

前回の記事[改【Railsチュートリアル】プロフィール画像をアプリ内で設定できるように変更](https://qiita.com/supyolo888/items/c1073ada0b04fb2f9e7f)に引き続きRailsチュートリアル第6版sample_appの機能拡張を進めていく。
今回は以下の様ないいね機能を実装していく。
![スクリーンショット 2021-11-28 3.17.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2200191/c76e336e-19be-1c53-bf34-b3c5a4c9fcc1.png)
**前提**
第6版sample_appが完成している

#Favoriteモデル

Favoriteテーブルを追加

“`
$ rails g model Favorite user_id:integer micropost_id:integer
“`

user_idとmicropost_idにインデックスを追加し、組み合わせがユニークであるという

元記事を表示

Rails 6.0 + Docker + MySQL5x + devise-token-auth での環境構築

## この記事の概要
– RailsのAPIモードで認証周り作ったときに苦労したので、備忘録メモとして…。

## 成果物
– GitHub: [try-rails6-api-with-devise](https://github.com/Nunnally-Engr/try-rails6-api-with-devise)

## 各種バージョン

– Ruby 2.7
– Rails 6.0.0
– mysql 5.7.21

## 前提条件

– Dockerを使える環境が整っていること

## できること

– Rails 6.0 + Docker + MySQL5x + devise-token-auth での環境構築
– devise-token-authを使った、サインアップ、サインイン、サインアウトができる
– ユーザがサインインしていることを確認し、サインインしていたらuser情報を取得する

## できないこと(やらないこと)

– コピペで環境構築できるように作った記事なので、各項目の詳しい説明は割愛

## 環境構築

元記事を表示

【Ruby】早期return

##早期リターン
式の値を戻り値としてメソッドの実行を終了。式が省略された場合には nil を戻り値とする。
条件分岐のネストが深くなりすぎてコードを読みにくくなってしまうときに使用すると可読性が高まる。
「Guard Clause」「ガード節」「ガード条件」「ガード構文」と呼ばれることもある。

“`ruby
def invalid_permission?(user)
if user.present? #<= この例外処理はGuard Clauseで書き直せる case user.permission when 1,2,3 false else true end else true end end ``` ```ruby def invalid_permission?(user) return true if user.blank? #<= この1行で例外チェックをネストなしで完了できる case user.permission when 1,2,3 false else

元記事を表示

【Rails】global source linesとは何か

##global source lines 
Gemfileに記述されるgemに対してsource、git、pathのオプションを指定しなければ、Gemfileの一行目にある引数のサイトから取得される。

“`ruby
source “https://rubygems.org”
“`

このsourceメソッドの行はマニュアル内で global source lines と呼ばれる事がある。

###sourceオプション 
gemを検索するサイトを取得

“`ruby
gem “gem_name”, source: “url”

#全てのオプションで、ブロックを用いて一括で書ける
source ‘url’ do
gem ‘gem_name1’
gem ‘gem_name2’
end
“`

####pathオプション 
ファイルシステム内のパスを指定し、gemの取得先とする

“`ruby
gem “gem_name”, path: “url”
“`

###gitオプション 
作成されたgemのgitリポジトリから取得

“`ruby
gem “gem_nam

元記事を表示

EC2のメモリ空き容量が減る場合の対処法

## 困っている事
* 本番に公開しているAWSが、3日おきぐらいに再起動する
* なぜ本番が3日おきに再起動するのか分からない

## 環境
* auto scaling使用
* ロードバランサ使用
* rails(6.1)
* 起動はpuma
* EC2プラン: t2.micro

## 前提情報
* ログに、`OOMキラー`が作動したという記述あり。その後EC2インスタンスが落ちている
* `/etc/sysctl.conf`で、OOMキラーが作動した時に、EC2インスタンスが再起動するように設定している
* EC2インスタンスが再起動したタイミングでnginxとpumaが起動するcrontabを設定している
* EC2インスタンスは再起動するとメモリがリセットされる
* 約3日後にOOMキラーが作動する、の繰り返し
* サイトは1日に5000人ほどのuserが登録するというアプリ

## 予想
* メモリリーク
* メモリブロート(メモリ断片化)
* のどちらかではないか

## 検証
* メモリリークの特徴: メモリ消費量が徐々に線形に増加
* メモリ断片化の特徴:

元記事を表示

OTHERカテゴリの最新記事