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

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

rubyでの正規表現問題の解説

rubyシルバーを勉強していくなかで、rubyの正規表現についてわからなかったので、解説していこうとおもいます。

今回は問題をもとにして、解説していこうとおもいます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/73888b2b-db40-569c-ce28-830c28ad3642.png)

この問題を解く上で、必要になる知識が
➀破壊的メソッド
➁正規表現

##➀破壊的メソッド
破壊的メソッドとは、オブジェクト自体を変更してしまうメソッドのことです。
破壊的メソッドがあるなら、非破壊的メソッドもあります。
言われてもピンとこないとおもいますので、この2つを比較しながら実際にコードを見ていきましょう

“`
##非破壊的メソッド
string = ‘abcdefgh’
string.delete(‘a’)
=> “bcdefgh”
p string
=> “abcdefgh”

##破壊的メソッド
string = ‘abcdefgh’
string.de

元記事を表示

複数のテーブルを結合した上でGroup Byを使用する際に詰まったところ

## なぜこの記事を書こうと思ったか
eager_loadで結合されたテーブルに対して集合関数を使用した際に、少しつまったので記事にしました。

## 結論
eager_loadは使用しない!

## なぜ
eager_loadは他のモデルに対して、検索や並び替えを行いたい時に使用します。ですが、groupメソッドを使用するさいはエラーが発生します。

エラーの理由はeager_loadは結合した全ての列を取得してきます。しかしSQLではGROUP BYを使用したときは取得する列として指定できるのは、GROUP BYで指定したものか集合関数を使用したものになります。

## 解決方法
では、他のモデルに対して検索や並び替えを行いたい。でもgroupメソッドも使用したい。そんな時はどうすれば良いでしょうか? left_joinメソッドを使用してください!

元記事を表示

キレイなMonkeypatchを書きましょう!(Gemの内容を別のGemでMonkeypatchした話)

# RubyのMonkeypatchとは?

身近な言葉のモンキー・パンチ、ではなく、パッチですね。
MonkeypatchはRubyでクラス・モジュールを開いて、その一部・もしくは全部を書き換えるということです。
Rubyの最大の魅力点でもありながら、あまりやらない方がいいとも言われています。

実はRailsに入っているActiveSupportというものがあって、その中にはMonkeypatchがいっぱい集まっています。
Twitter上でこれがいいことかどうかについて時々炎上しています。

### Stringクラスで簡単な例

“`ruby
class String
def neko
replace “cat”
end
end
cat = “neko”
cat.neko
cat
# => “cat”

module CatHelper
def neko
replace “neko”
end
end

String.prepend CatHelper
cat = “neko”
cat.neko
cat
# => “neko”

# String

元記事を表示

三項演算子で条件式が複数あるとき

##そもそも三項演算子とは?
if文が複数行にわたるとき、一行でそれを記述できるのが三項演算子です。

“`
条件式 A ? Aがtrueのときに出力する値: Aがfalseのときに出力する値;
“`
が基本形です。実際に具体例を見ていきましょう。

“`
a = 10
a > 10 ? ‘hoge’: ‘fuga’;
=> “fuga”
“`
aには10が格納されます。これは10より大きくはないので、falseです。つまり、fugaが出力されます。

これをif文で書くとどうなるでしょうか?

“`
a = 10
if a > 10
puts ‘hoge’
else
puts ‘fuga’
end
=> “fuga”
“`
このように6行で書かれるものが、2行で書けるというのが三項演算子のスゴイところですね。

##三項演算子の条件に複数あった場合はどうすればよいのか?
以下のようなコードがあるんです。

“`
a = 条件式1 ? 条件式2 ? “A” : “B” : “C”;
“`
このとき、以下の表にまとめたものが役に立ちます。

| 条件式1 | 条

元記事を表示

(初心者向け)Railsで論理削除とはなにか解説する

# 概要
この記事ではRuby on Railsを例として「論理削除とはなんぞ」や、
というのをざっくり解説したいと思います。

## 注意
この記事の投稿者はエンジニア初心者のぺえぺえですので、
予めその点も踏まえて参考にしていただければと思います。

## 謝辞
* 株式会社X-HACKさんで[ParkLoT](https://www.park-lot.com/)というTwitterインスタントウィンサービスのバックエンド開発をお手伝いさせていただいております。本記事ではその経験で得られた知識をアウトプットしています。ありがとうございます。
* 参考にさせていただいた記事は以下の通りです。ありがとうございます。
* [SQL で理解する DB の物理削除と論理削除](https://zenn.dev/kotahashihama/articles/f9676a52bd83c9)

## 物理削除と論理削除の違い
データベースのデータを削除する機会はよくあると思います。

* ユーザーの退会処理
* コメントの削除
* mixiの恥ずかしい黒歴史記事の削除
などなど。

ここで

元記事を表示

オブジェクト指向とruby on rails

#はじめに
この記事ではオブジェクト指向とかruby on railsの関係を個人的に整理します。

#オブジェクト指向
ググると以下のページがわかりやすかったです。
>[ロボットプログラミング教室](https://robo-done.com/blog/2021/04/doneship_object_oriented/#:~:text=%E3%80%8C%E3%81%82%E3%82%8B%E5%BD%B9%E5%89%B2%E3%82%92%E6%8C%81%E3%81%A3%E3%81%9F,%E3%82%92%E6%84%8F%E5%91%B3%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%80%82)
>◆オブジェクト指向とは?
「ある役割を持ったモノ」ごとにクラス(プログラム全体の設計図)を分割し、モノとモノとの関係性を定義していくことでシステムを作り上げようとするシステム構成の考え方のこと。

>・オブジェクト:直訳すれば「物」「対象」という意味。プログラミングにおいてはデータと処理の集まりを意味している。

元記事を表示

RailsアプリをHerokuにプッシュしたときに、「Failed to install gems via Bundler.」とエラーがでた時の解決方法

# 環境
– Ruby 2.6.6
– Rails 6.0.3

# 発生したエラー
Railsで作成したアプリケーションをGitHubにプッシュした後に、Herokuへプッシュしようとしたところ、以下の通りエラーが出て、Herokuへのプッシュができませんでした。

“`
$ git push heroku master
Enumerating objects: 114, done.
Counting objects: 100% (114/114), done.
Delta compression using up to 8 threads
Compressing objects: 100% (96/96), done.
Writing objects: 100% (114/114), 147.51 KiB | 6.15 MiB/s, done.
Total 114 (delta 7), reused 0 (delta 0), pack-reused 0
remote: Compressing source files… done.
remote: Building sourc

元記事を表示

integerを足し引きする方法【Rails】

レコードの値を足し引きするmethodを紹介します

テーブル構造

“`rb
create_table :tests do |t|
t.integer :score
end
“`

### increment(足す)

“`rb
Test.first.score
-> 50

# 50に20を足す
Test.first.increment(:score, 20)

Test.first.score
-> 70
“`

## decrement(引く)

“`rb
Test.first.score
-> 50

# 50から20引く
Test.first.decrement(:score, 20)

Test.first.score
-> 30
“`

## まとめ
足す時は`increment` 引く時は`decrement`です
便利なmethodなので使う時があったら参考にしてみてください〜

元記事を表示

【厳選】Railsで管理画面開発をする時のおすすめライブラリ集

管理画面をさくっとつくる場面が増えてきました。
その際に高頻度で使うおすすめのライブラリをまとめてみました。
なので、便利だけど管理画面に限らず使われるようなものは省略します。
正直、オススメ上位は超ド定番です。

# オススメ度: ★★★★★

## 【[ransack](https://github.com/activerecord-hackery/ransack)】 検索
検索を秒殺してくれるすぐれものです。有名すぎるので説明は不要ですが。。。
これ無しで検索をつくろうとすると、model層はかなり肥大化するのではないでしょうか。
まずは、ransackの機能で収まる範囲の検索をつくるのが吉だと思います。

https://github.com/activerecord-hackery/ransack

## 【[kaminari](https://github.com/kaminari/kaminari)】 ページネーション
ページネーションをviewも含め簡単に実装できます。
ransackを入れるなら迷わず入れておきましょう。
bootstrapなどのUIフレームワークに

元記事を表示

【FactoryBot】ファクトリの生成方法(build, build_stubbed, create, attributes_for)

# はじめに
RSpecでテストを記述する際、ファクトリの生成方法にいくつか種類があり、混同したので一度整理してみる。

## 環境
Ruby 3.0.3
Rails 6.1.4
rspec-rails 5.0.2
factory_bot_rails 6.2.0

# 前提
factoryファイルを以下のように記述し、挙動を確認します。
(ユーザーが会社の情報を投稿できるようなアプリケーションを想定しています)

“`ruby:spec/factories/companies.rb
FactoryBot.define do
factory :company do
sequence(:company_name) { |n| “company_#{n}” } # 会社名
company_overview { ‘sample_overview’ } # 会社の概要
company_address { ‘sample_address’ } # 所在地
company_num_of_emp { ‘100-150

元記事を表示

[初心者log]Rails API 複数Modelの情報をjson型で返す方法

#本記事の目的
Rails(APIモード) + Reactで開発をしている最中、Post一覧表示にUserのAvatarを付与したいと考え、やり方を調べたのでまとめます。

##失敗例
“`posts_controller.rb
class PostController < ApplicationController def index posts = Post.all hash = {} posts.each{|post| hash[post.id] = {post: post, user: post.user} } render json: { status: 200, posts: hash } end #以下略 ``` これだと返ってくる値がハッシュになり、React側で ```jsx posts.length > ? (
//処理1
) : (
//処理2
)
“`
といった記述ができなくなります。

###成功例

“`posts_controller.rb
class PostController <

元記事を表示

Rails × Vue をdocker-composeで環境構築する

# はじめに
アプリ構成を

* Backend: Rails
* Frontend: Vue.js

でDockerで環境構築した時の備忘録です。

# 使用技術

* Rails: 6.0.4
* ruby: 2.7.5
* MySQL: 8.0.28
* Vue: 3
* node: 16.13.2
* ブロジェクト作成ツール: Vite

# 作業内容

1. ディレクトリ/ファイルの作成
2. RailsのDocker環境を構築する
3. VueのDocker環境を構築する

# 1. ディレクトリ/ファイルの作成

ディレクトリ構造は以下の通りです。

* rootディレクトリ
* doker-compose.yml: 複数コンテナの設定
* .env: 環境変数の管理
* .gitignore: Gitで追跡させないファイルの設定
* backend: Rails構築のためのファイル群
* frontend: Vue構築のためのファイル群

“`shell:ターミナル

% tree root_directory
.
├── docker-c

元記事を表示

【Rspec】system testで並び順をテストする

# 結論

“`ruby
describe “並び順” do
let!(:task1) { Task.create(name: “name1”, content: “content1” }
let!(:task2) { Task.create(name: “name2”, content: “content2” }
it “作成されたタスクが作成日時の降順になっていること” do
visit “/tasks”
expect(page.text).to match(/#{task1.name}.*#{@ask2.name}/)
end
end

#改行を含む場合は
expect(page.text).to match(/#{task1.name}[\s\S]*#{task2.name}/)
“`

上記は、task1→task2の順番で画面上に表示されていることを検証するテストです。
`(/#{@task1.name}.*#{@task2.name}/)`の部分で順番のチェックをしています。
ここ

元記事を表示

&& || & |の使い方

##よく使われる&&と||の違い
この2つの違いは右辺が実行されるかどうかが重要なんです。
まず、&&演算子は左辺がtrueのとき、右辺が実行されるんです。
対して、||演算子は左辺がtrueのとき、右辺は実行されないんです。

そして、最後に実行されたコードの値を返すんです
論より証拠ということで、実例を見ていきましょう

##具体例

###&&

“`
If user_signed_in? && user.name == hoge
puts “fuga”
end
“`

このコードでは&&が使われています。先ほども述べたように、&&は左辺がtrueなら右辺を実行します。

このコードでいえば、ユーザーがログイン中であるなら、左辺のuserインスタンスのnameがhogeであるかを調べるんです

そしてuser.name == hogeがfalseなら、falseが返ってきて、trueならfugaが返ってくるんです

user_signed_in?がfalseなら右辺のコードは実行されません

###||

“`
If user_signed_in? || user.nam

元記事を表示

rails s実行後にlocalhostにアクセスすると[BUG] Segmentation fault at 0x0000000000000000が発生する

#現象
タイトル通りです。
Rails sコマンドを実行後にrootに設定しているページへlocalhostで接続するとエラーが発生します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2259269/1f75df76-8f5a-9f2b-59fe-0fd87aeeb10a.png)

#環境
Windows10 20H2
Docker desktop for windows -v 4.3.2
Docker -v 20.10.11
ruby -v 3.0.3
rails -v 6.0.4.4

#エラー対処方法
`/config/initializers/assets.rb` に以下の文を追加する

“`ruby
Rails.application.config.assets.configure do |env|
env.export_concurrent = false
end
“`

##余談
開発環境にGemを導入する前のGemのテスト環境でこのエラーが発生しました。
2

元記事を表示

RailsのSPAにJestを導入してみた話

## この記事の内容
業務で、`Rails`のSPAを作っています。フロントのテストフレームワークとして`Jest`を導入することになり、チームで探りつつ実装したので、その記録をまとめたいと思います。
なお、各種バージョンは以下の通りです。

– Rails … 6.1.0
– Jest … 27.4.7
– node.js … 14.19.0

## 必要なライブラリの導入

必要なライブラリを導入します。TypeScriptを使用していたので、Jestだけではなく @type/jest も必要でした。

“`shell
$ yarn add –dev jest @types/jest
“`
そして package.json の script に以下を追加します。

“`json:package.json
{
“scripts”: {
“test”: “jest”

},

}
“`

## 設定、ディレクトリ構成
この時点で `yarn test`を実行しようとすると、 `config/webpack/test.js`

元記事を表示

[個人開発]コンビニ食品でダイエットできるサービスを作りました

# はじめに
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/702672/8be19d8c-bad9-5fa5-eb5b-6b8fed5ca043.png)

普段みなさんはどれぐらいコンビニを利用しますか?
[ある統計](https://vropencafe.video-research.jp/figures/figureofmonth-29.html)では、1ヶ月に1回以上コンビニを利用する人は94.6%という結果が出ていました。

最近は「たんぱく質が摂れる」といった、健康志向の高まりに合わせた食品が出ている印象を受けますね
中には、**「たんぱく質が摂れる食品を選べば痩せられる!」**という人もいるでしょう
 

ただ、みなさんご自身に適した摂取カロリーはご存知ですか?
健康的な食品を選択しても、ご自身のカロリーを上回る量を摂取していたら台無しです
 
 
そこで、**Macro Store(マクロストア)**というサービスを開発しました。
**※スマートフォン推奨**

htt

元記事を表示

【RSpec】テスト後に画像ファイルを削除したいとき

CarrierWaveを使用していてRSpec実行した後のアップロードファイルを削除したいとき
下記を追記すればいいという記事をいくつか見かけた。

“`spec/rails_helper.rb
config.after(:suite) do
FileUtils.rm_rf(“#{Rails.root}/public/uploads”) #←ファイルがアップされるパス指定
end
“`

.gigtinoreにパスを追記するだけで上記は必要なくなる。

“`
public/uploads
“`

元記事を表示

RailsアプリCICDパイプライン構築の手順(備忘録)(Docker+Rspec+GitHubActions+heroku)

#はじめに

つい最近DockerとCICD(Travis CI)を学んだので、実践がてらローカルのRailsアプリをDocker環境に移行し、CICDパイプラインを構築してみました。いろいろな方の知恵をお借りしてなんとか構築できたので、自分の備忘録として記録します。CICDツールには、最近登場したGitHubActionsを使用しています。
※まだまだ初学者ですので、間違い等あればご指導ご鞭撻のほどよろしくお願いいたします。

#環境
Mac OS Monterey12.1
Ruby2.5.3
Rails5.2.5
MySQL(latest)

#1.Dockerfileの作成

**Dockerfile**

“`Dockerfile:Dockerfile
FROM ruby:2.5.3
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
node.js \
mysql-client \
yarn
WORKDI

元記事を表示

[Ruby]ありえない分岐には雑にraise NotImplementedErrorを置いておくと便利

下記の実装を見てください。
type1、またはtype2の2種類のタイプを持つhogeインスタンスがあり、タイプごとに処理を分岐しています。

“`ruby
case
when hoge.type1?
# type1の処理
when hoge.type2?
# type2の処理
end
“`

タイプが2種類なのでこの実装で問題はないのですが、私はこういう分岐のelseに`raise NotImplementedError`を書いておくことが多いです。

“`ruby
case
when hoge.type1?
# type1の処理
when hoge.type2?
# type2の処理
else
raise NotImplementedError
end
“`

こうしておくと何が良いのか?
のちにtype3というタイプが増えたとします。
その時にtype3のテストパターンを追加すると思いますが、type3の場合はelseに入るためここを修正しないとテストが必ず落ちます。
最初の実装ではcase文がスルーされるのでテストの書き方次第ではここを修正しなくても

元記事を表示

OTHERカテゴリの最新記事