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

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

【個人開発】バチェラーの優勝予想をする放置ゲームを開発しました

> 最初から優勝者を当てていたのに、その証拠がなく誰にも自慢できなかった。

これがバチェラー・ジャパン シーズン2(2018)を見終えたときから
自分の中に残っていたモヤモヤであり、本アプリ開発の背景です。

## サービス概要
[![Image from Gyazo](https://i.gyazo.com/06ced0101bbc63e1f402b3bd7a900bdf.jpg)](https://bachelor-derby4.herokuapp.com/)
文字通り「バチェラー・ジャパン シーズン4」の優勝予想をするシンプルなゲームです。
1分で遊べて人間観察力の自慢ができるサービスです。

https://bachelor-derby4.herokuapp.com/

## 使用技術
– Ruby
– Ruby on Rails(API)
– slim
– sorcery
– jwt
– meta-tags
– JavaScript
– axios
– bootstrap
– Vue.js
– Vuex
– V

元記事を表示

Dockerを使ってRails5の初期環境をサクッと構築する

## はじめに

そうだ、Rails環境、作ろう。
(BGM: 「My Favorite Things / The Sound of Music」)

## この記事の目標

– `docker compose up` したらホスト側からrailsのウェルカムページが表示できるコンテナイメージを作成するDokerfileおよびdocker-compose.ymlを作成する。
– DBは個人的な好みでpostgresqlにする(それほど特にこだわりはないけど)
– DBはホスト側のSQLツールから接続できるようにする。
– ホスト側の環境は極力汚さない。

## 作業環境

– Windows10 Pro(MacOSでも手順は変わらないと思います)
– Docker Desktop version 4.1.1
– Visual Studio Code 1.59.1
– 以下の機能拡張をインストールしておく。
– Remote Development
– Docker

## 作成手順

### docker-compose.ymlの構成

コンテナを2つ作ることとします。

元記事を表示

【ポートフォリオ解説】date-matchの全てがこれで分かる!

#初めに
この記事は、date-matchを詳細に解説した記事です。
この記事とGitHubのREADMEとの違いは次のとおりです。

“`
この記事:date-matchをより詳細に解説して、情報を網羅的に把握ができる。
README:date-matchの概要を把握ができる。
“`
date-matchの辞書的な位置付けとして、この記事を作成しました。
気になる項目だけでもご覧頂けたら、幸いです。
※随時、項目を追加予定です。

#アプリ概要
あなたの行きたい場所やイベントを提案・検索することで、デート相手を効率よく見つけることができるマッチングアプリです。
主に、次の3点ができます。

“`
1. 行きたい日時やプランなどを添えて、提案ができる
2. 住所やキーワードなどで検索、行きたい日時が近い順などで並び替えができる
3. ダイレクトメッセージを通じて、招待ができる
“`

これらが出来ることで、既存のマッチングアプリにはない、このアプリ特有のメリットが3点あります。

“`
1. 自分の行きたい場所に共感してくれている人、行きたい日時が合う人から、お相手を効率よく

元記事を表示

Railsで複雑なSQLを書いた時のお話(複数テーブル結合・相関サブクエリなど)

# 記事について
2021年4月からwebエンジニアとして働いています。まだエンジニア歴1年未満のペーペーです。
月に1~2回、学んだことをアウトプットするために記事を書いていこうと思います。記事内容は実務使う技術だったり、技術書や動画で学んだことだったり、適当に興味あることを書いていきます。

# 今回の背景
Railsを使った開発業務で複雑なSQL書く必要があったので、その時調べたことや気をつけたことをまとめてみます。ちなみに使っているDBはMYSQL。

# 目次
1. SQLのみで書いてみる
2. Railsっぽく書き換える
3. セキュリティ対策を考える
4. エラー対策を考える
5. その他SQL書くときに便利な書き方を考える
6. まとめ

## 1. SQLのみで書いてみる
最初からmodelクラスに書いてくとわけわからなくなるので、SequelProなどを使ってSQLを書いてそれを元にRailsを組み立てていくほうが圧倒的に効率がいいことを学んだ。
そして今回業務で書いたSQLはざっと以下の構成。

“`sql
SELECT `取得したい値`
FROM `相関サ

元記事を表示

【Rails × Vue・ SPA】<%if logged_in?>のような書き方をvueで再現する方法

初めてVueを使用してrailsアプリのSPA化を行う際にrailsのviewで記述していた<%if logged_in?>のような書き方について詰まったのでその方法についてまとめました。

#結論
vuexを使う。
インストール方法については割愛します。
※私はVue.js超入門を参考にしました。
https://booklive.jp/product/index/title_id/914468/vol_no/001

#Vuexの使用法

今回はstore.jsというファイルに書いていくと仮定します。
ログイン中かどうか、管理者ユーザーかどうか、ゲストログイン中かどうかという3点について条件分岐してページの表示内容を変更するためのvuexは下記の通りです。

“`

import { createStore } from ‘vuex’

export const store = createStore ({
state() {
return {
loggedIn: false,
admin: false,
guest: false

元記事を表示

Rubyにおける : の意味

#はじめに
Rubyでコードを書いていると、`:`や`::`がよく出てきますが、
いまいちはっきりと理解できていなかったためまとめてみます。

##シンボル

シンボルとは、任意の文字列に`1対1`に対応するオブジェクト
`:hoge`のように表す
下記のように、文字列が都度異なるIDになるのに対し、シンボルではすべて同じIDになる

“`ruby
[1] pry(main)> :hoge.object_id
=> 2307228
[2] pry(main)> :hoge.object_id
=> 2307228
[3] pry(main)> “hoge”.object_id
=> 300
[4] pry(main)> “hoge”.object_id
=> 320
“`

##ハッシュのキーにシンボルで使う場合
ハッシュのキーには一般的に文字列ではなく、シンボルを使用する
理由としては、文字列よりも高速で値を取り出すことができるため

“`ruby
[1] pry(main)> hash = { name: ‘太郎’, age: 20 }
=> {:name=>”太郎”, :

元記事を表示

<ゲストログイン機能>ゲストユーザーの検索にidを使用するのは避ける方が良い

# はじめに
この記事はプログラミング学習中に得た知見を備忘録としてまとめたものです。
知っている人にとっては当たり前であったり理解が足りていないと感じられる内容も含むかと思いますので、あらかじめご了承ください。

# この記事で分かること
– Railsにおいてテーブルの主キーにはAUTO INCREMENTが設定されています。
– そのため、値がuniqueになるように自動採番されます
– `$ rails db:reset`でテーブルの再構築をした際、開発環境はAUNO INCREMENTは自動的にリセットされますが、本番環境(Heroku)ではリセットされません
– そのため、ゲストユーザーなど初期データで投入するとしても、テーブルのidカラムに依存した処理はNGです。

# 環境
**ローカル環境**
– Ruby 6.1.4
– Rails 3.0.2
– mysql2 0.5.3

**本番環境**
– Heroku
– ClearDB MySQL

# 背景
####ポートフォリオの作成においてゲストログイン機能を実装
すでにHerokuにデプロイしているアプリ

元記事を表示

Rails ruby 2.6.0 のdockerイメージでwebpackが動作しない

###
Ruby 2.6.0でインストールされるyarnのversionが古い可能性がある。

“`
#Dockerfile

RUN set -x && curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add – && \
echo ‘deb http://dl.yarnpkg.com/debian/ stable main’ > /etc/apt/sources.list.d/yarn.list

RUN set -x && apt-get update -qq && \
apt-get install -yq build-essential yarn

“`

コンテナ内でversionを確認

“`
yarn –version
1.22.15
“`

これで動作した。

元記事を表示

本日のアウトプット1

クラスとは?インスタンスとは何か?についてまとめていきます

クラスとは、一言でまとめると「雛形作るためのもの」です
車を例にして例えると、車にはハンドル、タイヤ、エンジンが付いているなど共通している部分があります。この共通している部分をまとめているものが、クラスです。

インスタンスとは、一言でまとめると「クラスから作ったもの」です
1から車を作るのは大変でも、クラスがあることで短時間で大量生産が可能になります。
しかし共通するもの部分はあっても、タイヤの大きさ形が微妙に違うといったことはあります。
つまり、インスタンスはできたものによって詳細が異なります。

Rubyには初めから使えるクラスがあります。
代表的な例で言うと、stringクラスですね。
興味がある方は是非調べてみましょう

クラスやインスタンスは自分で定義することができます。

クラスの定義方法から説明していきます。
class クラス名
 内容
ned
このようなコードで定義していきます。

インスタンスはnewメソッドで定義していきます。

元記事を表示

【Ruby on Rails】rails sして立ち上がらない時の解消方法

#はじめに

久しぶりにrailsのサーバーを立ち上げようとしたら以下のエラーが出たので、解決方法をメモしておきます。

““
=> Booting Puma
=> Rails 5.1.6 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode…
* Version 3.9.1 (ruby 2.4.1-p111), codename: Private Caller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:8080
Exiting
/usr/local/rvm/gems/ruby-2.4.1/gems/puma-3.9.1/lib/puma/binder.rb:269:in `initialize’: Address already in use – bind(2)

元記事を表示

1日1投稿の制限を実装する方法(メモ)

##環境
– Ruby 2.6.5
– Rails 6.1.4.1

##背景・目的
– ポートフォリオで習慣化を可視化するアプリを開発中。
– 現状、ユーザに対して1対多の菅家なので、実施内容を繰り返し何回でも投稿できるようになっている。
– Model側ではなくView側で投稿制限を実装する。

##実装

“`rb:app/views/task/index.html.haml
###

– if @taskes.last != nil
– if @taskes.last.created_at.day < Date.today.day = link_to '追加', new_article_task_path, class: 'btn-mini-confirm' -else - if @taskes.last.created_at.month < Date.today.month = link_to '追加', new_article_task_path, class: 'btn-mini-confirm' - else

元記事を表示

Rubyのsuperはメソッドチェインできる

# 概要

> super は現在のメソッドがオーバーライドしているメソッドを呼び出します。括弧と引数が省略された場合には現在のメソッドの引数がそのまま引き渡されます。引数を渡さずにオーバーライドしたメソッドを呼び出すには super() と括弧を明示します。

https://docs.ruby-lang.org/ja/latest/doc/spec=2fcall.html#super

この`super`ですが、以下のようにメソッドチェーンすることで続きの処理を書くことができます。

“`ruby
def some_method
super.to_s
end
“`

# 詳細

例えば次のような受け取った引数を使って文字列を返すメソッドを持ったクラス`Klass`があるとします。

“`sample.rb
class Klass
def hello(arg: nil)
“Hello #{arg}!”
end
end

klass = Klass.new
result = klass.hello(arg: “World”)

puts result
“`

元記事を表示

RspecでAPIをテストするときにnullをパラメータに含む方法

# 問題

Ruby on Rails の Rspec で JSON を受け取る API をテストするとき、渡すパラメータの値に異常値も入れてテストしておきたいなぁと思います。よくある異常値として null がありますね。
でも、これをテストするのはちょっと難しいです。
なぜなら、チュートリアルでよくあるようにパラメータをハッシュにして API のエンドポイントに渡そうとすると、 null はハッシュの値として認めてもらえず、 ArgumentError になってしまいます。
ハッシュを `to_json` メソッドでJSONに変えようとしても同じことです。
ではどうしたら null をパラメータに含めてテストすることができるのか、考えました。

# 解決方法

JSON を文字列として作り、その JSON に null を含めたものを API のパラメータにすればOKです。
コードは以下になります。

“`null_spec.rb
require “rails_helper”

RSpec.describe “エンドポイントにnullを渡す”, :type => :request

元記事を表示

RailsでON句を綺麗に書きたい

# 目的
ActiveRecordで、(WHERE句でなく)ON句で絞り込んでからテーブルをJOINしたいが、ON句用のメソッドがない。
できるだけActiveRecordっぽく、綺麗に書きたい。

# 結論
テーブルをJOINする`.join()`の直後に、`.join(“AND …”)`でON句は直書きする。

“`ruby
Sample.joins(:users) # usersテーブルをJOIN
.joins(“AND users.type = #{User::USERTYPE_COOK}”) # 調理師(ON句)
.where(users: {id: params[:user_id]} )
“`
“`
SELECT `samples`.*
FROM `samples`
INNER JOIN `users`
ON `users`.`id` = `samples`.`user_id`
AND users.type = “cook”
WHERE `users`.`id` = 1
;
“`

# 備考
`.merge()`を試したがダ

元記事を表示

Userモデルの単体テストコードを書く

#①.事前準備

サンプルアプリを例にして、モデル単体テストの実装をはじめる前に、Userモデルのバリデーションを変更します!

#文字数制限のバリデーションを設置

「保存できる値は最大6文字まで」というバリデーションを設置します。
user.rbを開き、以下のように記述してください。

“`php:app/models/user.rb
class User < ApplicationRecord # Include default devise modules. Others available are: # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :eats has_many :comments # commentsテーブルとのアソシエーション

元記事を表示

【Ruby】抽象クラスを作る

##環境
Ruby 3.0.2
Rails 6.1.4.1

##抽象クラスとは

抽象クラスは、その特徴としてクラス自身はオブジェクトの実体、インスタンスを生成できない。
抽象クラスは主にそのクラスを親クラス(基本クラス)とした子クラス(派生クラス)を定義(継承)する前提で作製されるクラス。

Rubyではサポートされてないけどそれっぽいものを作れる。

“`ruby
class Parent
def method_1
raise ‘implement this method in subclass’
end
end

class Child < Parent def method_1 'hogehoge' end end ``` ```ruby parent_class = Parent.new parent_class.method_1 # => RuntimeError: implement this method in subclass

child_class = Child.new
child_class.method_1
# =>

元記事を表示

【RSpec】スタブとモック

##スタブ
オブジェクトのメソッドをオーバーライドし、事前に決められた値を返します。つまりスタブは、呼び出されるとテスト用に本物の結果を返す、ダミーメソッドです。スタブをよく使うのはメソッドのデフォルト機能をオーバーライドするケースです。特にデータベースやネットワークを使う処理が対象になります。
(引用:Everyday Rails – RSpecによるRailsテスト入門)

– メソッドの中のメソッドをスタブしてテストしたいとき

“`ruby
user = User.new
allow(user).to receive(:full_name).and_return(‘user’)
“`

##モック
本物のオブジェクトのふりをするオブジェクトで、テストのために使われます。モックはテストダブル(test doubles)と呼ばれる場合もあります。モックはこれまでファクトリやPOROを使って作成したオブジェクトの代役を務めます(訳注:英語の“double” には「代役」や「影武者」の意味があります)。しかし、モックはデータベースにアクセスしない点が異なります。よって、テストに

元記事を表示

uninitialized constant Rack::Protection

## 概要

Railsアプリの開発でSidekiqを使う場面があると思います。
その際にハマった問題についてまとめていきます。

### 敬意

[sidekiq web interface show Forbidden when I try delete or post operations. · Issue #1289 · mperham/sidekiq](https://github.com/mperham/sidekiq/issues/1289#issuecomment-415714146)に紹介されている方法でRackを用いて特定のドメインのみsidekiqを扱えるように設定をした際にこの問題が起きました。

### エラー内容

sidekiqを`v6.0.x`を使って、先ほどのいるとタイトルのエラーが発生します。

“`ruby:config/routes.rb
require ‘sidekiq/web’

Sidekiq::Web.set :session_secret, Rails.application.secrets[:secret_key_base]
Sid

元記事を表示

Railsのエラーメッセージの階層、インデントの書き方

##やりたいこと
・ja.ymlファイルを編集してエラーメッセージを日本語化したい。
・カラム名は日本語に変更できたので、エラーメッセージのkeyを編集して
 完全な日本語にしたい

##エラー内容
・I18n::InvalidLocaleData in Topics#new
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2301963/204a35a5-d708-edd6-a50c-b13a99245415.png)

##原因
・ja.ymlファイルのインデントがあっていない
・そもそもファイルが読み込めていない
ちなみにこの段階でのymlファイルはこんな感じ
“`

“`
ja:
activerecord:
models:
user:
attributes:
user:
name: 名前
email: メールアドレス
user_area: 勤務地
user_jo

元記事を表示

多対多に関連付けられた要素を登録する

# はじめに
 前回の記事からしばらく期間が空いてしまった。全く何もやっていないということはなく、ポートフォリオアプリのコードを粛々と書いていた。

 一対多は前回説明したので、今回は多対多の要素を登録するやりかたを記す。

# やりたいこととDB構造
 開発中の日報アプリには振り返り機能がある。あらかじめ目標を設定しておき、振り返りの段階でそれが完了したかどうかをチェックする。以下の流れになる。

step1. 事前に目標を複数登録
step2. 振り返る目標を複数選択
step3. それぞれの目標に対して進捗を振り返り
step4. 総括のコメントを追加

必要となるテーブルはPlan/Review/ReviewItemの三つ。
Plan → ReviewItem(多) / Review → ReviewItem (多)の多対多の構造をとっている。

というわけで振り返り機能を実装するときに多対多の要素の登録が必要になった。
それぞれは以下のようになっている。

### Planモデル

“`ruby:app/models/plan.rb
class Plan < Ap

元記事を表示

OTHERカテゴリの最新記事