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

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

Laravel と Ruby on Rails の CRUD

Laravel と Ruby on Rails でそれぞれアプリ開発をしていて,CRUD に対応するアクション名を混同しそうになったので整理したいと思います!

# Laravel での CRUD

以下のように書くことで,
“`php
use App\Http\Controllers\PhotoController;

Route::resource(‘photos’, PhotoController::class);
“`
下の表のような,様々なアクションを処理するためのルートを定義できます!

|HTTP verb |パス |アクション | 目的|
|—|—|—|—|
|GET |/photos |index |全ての写真の一覧を表示|
|GET |/photos/**create** |**create** |写真を1つ作成するためのHTMLフォームを返す|
|POST |/photos |**store

Rails6でJavaScriptの動的読み込み

## 実現したいこと
JavaScript内からDB内のデータを動的に読み込みたい✅

## 開発環境
Rails6系
Ruby3系

アプリ:[Muscle Beat](https://www.muscle-beat.com)(スマホ専用筋トレ系音ゲー)
[GitHub](https://github.com/jibiking/muscle_beat)
テーブル(例)↓
[![Image from Gyazo](https://i.gyazo.com/a0eef96b76e54d3df43a1c5255f5566e.jpg)](https://gyazo.com/a0eef96b76e54d3df43a1c5255f5566e)

## 結論
view内の“`scriptタグ“`に“`erbタグ“`を用いて動的に読み込ませたいJSを記載します!

たしかにRails6系のJavaScriptの記述は“`app/javascript/packs“`以下にするのが通常です。
しかし上記pack

Railsでphina.jsの動的読み込み

## 実現したいこと
バックエンド(Rails)から保存したDB内のデータを呼び出して、動的にフロント(phina.js)に入れて、ゲームをプレイできるようにする✅

[phina.jsとは](https://phinajs.com/):ゲームを簡単に作ることのできるJavaScriptのライブラリ

## 開発環境
Rails6系
Ruby3系
phina.js 0.2.3(CDN)
アプリ:[Muscle Beat](https://www.muscle-beat.com)(スマホ専用筋トレ系音ゲー)
[GitHub](https://github.com/jibiking/muscle_beat)
テーブル(例)↓
[![Image from Gyazo](https://i.gyazo.com/a0eef96b76e54d3df43a1c5255f5566e.jpg)](https://gyazo.com/a0eef96b76e54d3df43a1c5255f5566e)

## 1. viewでphina.jsの環境構築
ゲームプレイ画面を作成するvi

Next.jsについてRailsと比較しながら少し調べた

# 0. はじめに

使ったことはないが気になったので調べてまとめた。

# 1. RailsとNext.jsの比較

|| Rails | Next.js |
|:-:|:-:|:-:|
|雛形作成 | `rails new` | `create-next-app` |
|ルーティング| routes.rb | File-system Routing |
| クライアントサイドルーティング| turbolinks | next/link |
| Static Site Generation| ○
(ActiveRecordが不要なのでRailsを使う必要はない。) | ◎ |
| Server Side Rendering| ◎
(Server Side Templatingとも呼ばれる。) | ○ |
| Client Side Rendering |△
(フレームワークのような規約がないJavaScriptでAjaxを実行する必要がある。)| ○
(File-system RoutingやSEO/OGPの最適化が不要になるため、Reactを使った方

「Rails」urlとpathの違いを初心者向けに解説

# _urlと_pathの違いについて

簡単に申し上げるとurlは絶対パスでpathは相対パスである。

### urlについて解説

_urlの形は絶対パスである。例えば、 
“`new_user_url“`という書き方は “`http://localhost:3000/users/new“`と書くのと同意である。
リダイレクトではHTTPの性質上、完全なURLが求められるのでredirect_toメソッドの引数はURLで指定するべきである。
逆に言えばredirect_toメソッドの引数でしか_urlという書き方は使われない。
### pathについて解説

_pathの形は相対パスである。
“`new_user_path“` という書き方は “`/users/new“`と書くのと同意である。
_pathという形は基本的にredirect_to以外で使うと覚えておけば良い。
例えばform_withやlink_toなど。

## 「“`redirect_to @post“`」という書き方(上級者向け)

“`redirect_to post_url(@p

Git,Githubを使用してherokuへデプロイ

初めての投稿になります。
こちらは、私の備忘録として残しておきます。

# 前提
デプロイしたいアプリが作成済み、GitHubにアカウント登録済み、GitHubにリポジトリを作成済みで、ブランチを切っている状態で、今回はrailsで作成したアプリをデプロイしていきます。

# 実行の流れ
“`!!!
まず、ステージングエリアにカレントディレクトリ以下のファイルをまとめて追加します
git add .

次に自分が変更したファイルをローカルリポジトリに保存します。
git commit -m “コミット名”

Githubにプッシュします。
git push –set-upstream origin ブランチ名

こちらでmasterブランチに変更します。
git checkout master

Githubにプッシュしたブランチ名を使用してマージを行います。
git merge ブランチ名

最後にherokuにデプロイします。
git push heroku
“`
これでherokuへのデプロイが完了です。

# まとめ
初めての投稿なので、誤字脱字やご指摘等ありましたらコメ

エラーメッセージの日本語化

オリジナルアプリを開発する過程で、ユーザー登録時に入力に誤りがあった場合に表示されるエラーメッセージを日本語化に。

備忘録のため手順を記載する。

まずはapplication.rbを編集。

“`ruby:config/application.rb
module Grucale
class Application < Rails::Application version. config.load_defaults 6.0 config.i18n.default_locale = :ja #追記 end end ``` ※``:ja``は日本語設定を意味する 次にGemfileの記述 ```rubu:Gemfile #最下部に追記 gem 'rails-i18n' ``` 追記したら``bundle install``を実行。 ここまでで挙動を確認すると、``Passwordを入力してください``のように一部しか日本語化されていない。 それを解消するために英語から日本に翻訳してくれるファイルを作成する。 config/localesディレ

Railsの3つの環境【Ruby on Rails】

Railsには以下の3つの環境がある
* テスト環境(test)
* 開発環境(development)
* 本番環境(production)

Railsの`Rails`オブジェクトには`env`属性があり、開発環境において、`Rails.env.development`を実行すると、`true`が返ってくる。

Rails consoleやRails serverはデフォルトでは開発環境だが、`$ rails console test`、`$ rails server –environment production`など環境をパラメータとして渡すと、その環境で実行することができる。

また、アプリケーションを本番環境で実行する場合は、`rails db:migrate`を本番環境で実行してデータベースを作成する必要があり、`$ rails db:migrate RAILS_ENV=production`を実行する。

注意としては、上記のように、console、sever、migrateで環境の指定の仕方が違う。

Herokuは本番サイト用のプラットフォームのため、デフォルトで

【個人note】Ruby on Rails

## 慣習

#### Rubyでは真偽値(true, false)を返すメソッド名は慣習的に’?’をつけることが多い。
参考:[Array#include?](https://docs.ruby-lang.org/ja/3.0/class/Array.html#I_INCLUDE–3F)

####

####

####

####

## 演算子
true = 真
false = 偽

参考:[Rubyの演算子まとめ!Rubyの演算子をマスターしよう!](https://blog.codecamp.jp/posts-34186)

## Rubyのクラスとインスタンスそしてselfの説明

参考:[Rubyのクラスとインスタンスそしてselfの説明](https://ogatanoyarou.com/index.php/2021/03/24/rubyself/)

“`models/user.rb
TODO: ゲストかどうか判別するメソッドを定義
def guest?
self.email == “guest@example.com

VScodeでerbファイルをEmmet有効にする際に気づいたこと

VScodeのEmmet補完の設定

erbファイルでもEmmetを有効にするには、VScodeのsettingにある **Emmet:include Languages** を設定します。ググって調べると以下の画像のように設定で完了したらいいらしい。
[![Image from Gyazo](https://i.gyazo.com/df3d872e452cad2660d33c138628da31.png)](https://gyazo.com/df3d872e452cad2660d33c138628da31)
ただ私の場合はこれだけでは機能しませんでした。少し時間をかけて調べてみると以下の画像のように設定を加えたら解決しました。
[![Image from Gyazo](https://i.gyazo.com/3abf751346c6b0f43940df644fbbff8b.png)](https://gyazo.com/3abf751346c6b0f43940df644fbbff8b)
ちなみに**setting.json**へ直接記述しても設定は変更できます。
“`

Rspecでのdevise_token_authの認証テストがうまくいかなかった

こんばんは

QiitaでRspec/devise_token_authで[調べて出てきたの](https://qiita.com/mtoyopet/items/ed1bd4b9c1544d401880)を参考に認証が通った状態でpostができるかのテストをしてみたところ、詰まったのでここに書き残しておきます
# 認証エラーの起きたテストコード
“`Ruby:authorization_spec_helper.rb
module AuthorizationSpecHelper
def sign_in(user)
post api_v1_user_session_path,
params: { email: user[:email], password: user[:password] },
as: :json

response.headers.slice(‘client’, ‘access-token’, ‘uid’)
end
end

“`
まずQiitaの記事を参考に、サインインしたときにレスポンスのclient,access-

RailsでREST API設計するときに知っておきたい集

## RESTについて

– RESTとは
– Representational State Transfer。WebAPIの共通仕様、アーキテクチャスタイル。またはそれを用いたシステム。
– RESTfulとは
– RESTの設計原則に従ったシステムのこと。

[Representational State Transfer – Wikipedia](https://ja.wikipedia.org/wiki/Representational_State_Transfer)

### RESTの設計原則

#### 1. ステートレス(Stateless)

– サーバ側で状態の管理を行わない。
– クライアントが送信するHTTPリクエストには、サーバがそのリクエストを処理するために必要な情報が全て含まれており、以前のリクエスト情報にも依存しない。
– セッション情報を保持しない。
– だが、クッキー等によるセッション状態の管理を行なっているシステムもRESTfulと呼ばれる。

#### 2. 統一インターフェース(Uniform Interface)

Rubyのぼっち演算子について

# ぼっち演算子`&.`

「レシーバがnilのときに起こるエラーを回避するため」に`.`の代わりに` &.`を使います。
レシーバがnilでもエラーにならず、nilを返してくれます。

“`ruby
user = User.new
user.name # => “ユーザー名”

object = nil
object.name # => NoMethodError
object&.name # => nil
“`

ifや三項演算子でも書くことができます。

“`ruby
# ifを使った書き方
name = if object
object.name
else
nil
end

# 三項演算子を使った書き方
name = object ? object.name :nil
“`

【Rails 6】片方の選択によってもう片方のオプションの値が変化する動的なセレクトボックスを作る

## 概要

タイトル通りのものを作ります。文字だけだとわかりにくかったら、次の完成イメージを見てください。

## 完成イメージ

![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/688854/63098019-e563-05c7-934f-2f6811b17010.gif)

## 仕様

– Ruby 3
– Rails 6
– MySQL 5.7
– Bootstrap 5
– Docker

※ Bootstrap はバージョン5から JQuery が不要になり導入方法が少し変わったのでご注意ください。

## 下準備

まず最初に下準備から始めていきます。

### 各種ディレクトリ & ファイルを作成

“`
$ mkdir rails-dynamic-selectbox && cd rails-dynamic-selectbox
$ touch Dockerfile docker-compose.yml entrypoint.sh Gemfile Gemfile.loc

Rubyの大クラス主義について解説してみた

Rubyを勉強していったら、「Rubyには大クラス主義というものがあるんだよ」というのを聞いて、自分はよくわからなかったので調べてみてわかったことを記事にしようとおもいます。

## 大クラス主義
例えば、配列を表すクラスにArrayクラスというものがRubyにあります。そしてArrayクラスにはpopメソッドやunshiftメソッドがあります。
ここから分かることはArrayクラスにはキューやスタックとしても使えるんです。
自分はJava等の言語を触ったことはないのですが、JavaではQueueクラスやStackクラスとそれぞれ分かれているみたいです。
他にもeachメソッドがありますが、JavaではIteratorクラスが用意されていて、それぞれが処理するみたいです。

このようにRubyのArrayクラスでは、Arrayクラスでは担う役割が大きいんですね。そのことを**大クラス主義**といいます。

※キューやスタックについてよく分からない方は以下の記事を参照にしてみてください

https://qiita.com/jnchito/items/62b9bab0455ed0f47d

同じテーブルに複数の関連づけ

同じテーブルに対し、複数のリレーションを持っている時のModelの書き方

Staff(職員)は複数のAsessments(評価)を持っている。その評価には評価される人(staff_id)と評価する人(input_staff_id)が存在する。両者に関係を持つようにModelに追記したい。

以下のようなER図を想定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2508607/a56f21f1-3c0f-760f-0ad8-fe7b89523968.png)

外部キー(foreign_key)と関連先のクラス名(class_name)を指定するだけでOK。

“`Assessment.rb
belongs_to :input_staff, foreign_key: ‘input_staff_id’, class_name: ‘Staff’
belongs_to :staff, foreign_key: ‘staff_id’
“`

`input_staff`と`st

【エラー備忘録】Windowsローカル環境で$rails db:resetできない場合にマイグレーションを行う手順

# 目次
– 状況、前提
– エラー内容
– 原因
– 解決方法
– 参考リンク

# 状況、前提
Railsでポートフォリオを作成している最中、マイグレーションしなおそうと$rails db:resetした際にエラーにハマる。
Windows 11
Ruby 3.0.2
Rails 6.1.4

# エラー内容
“`
Permission denied @ apply2files – C:/myapp/db/development.sqlite3
Couldn’t drop database ‘db/development.sqlite3’
rails aborted!
Errno::EACCES: Permission denied @ apply2files – C:/myapp/db/development.sqlite3

Tasks: TOP => db:drop:_unsafe
(See full trace by running task with –trace)
“`

# 原因
Windowsではrailsコマンドでファイルを削除できないのが原因。

# 解決

Userモデルのバリデーションを解説【Ruby on Rails】

## どんな値も取れるname属性・email属性は問題!
例えば`name`は空であってはならず、`email`はメールアドレスのフォーマットに従う必要がある。さらに、メールアドレスをユーザーがログインするときの一意のユーザー名として使おうとしているため、メールアドレスがデータベース内で重複することのないようにする必要もある。

属性値には、何らかの制約を与える必要がある。Active Recordでは**検証(Validation)** という機能を通して、こういった制約を課すことができるようになっている。

よく使われるのは
* 存在(preference)の検証
* 長さ(length)の検証
* フォーマット(format)の検証
* 一意性(uniqueness)の検証
* 確認(confirmation)の検証

### 検証はテスト駆動開発にぴったりの機能!
`setup`メソッド内の処理は、各テストが走る直前に実行される。`@user`はインスタンス変数だが、setupメソッド内で宣言しておけば、全てのテスト内でこのインスタンス変数が使えるようになる。
したがって、`

rails db:migrateを実行した時に出たエラーを解決した話

# はじめに
1月〜プログラミングスクールで学習しています。
これから平日は~3/25まで毎日何かしらアウトプットのため投稿を続ける予定です。
今回は rails db:migrateコマンドを実行した際に出たエラーについて書きます。
※Ruby2.6.5の環境を使用し学習しています。

# 問題
rails db:migrateコマンドを実行すると下記エラーが出ました。
ただ、思い当たる節が合ったためすぐに解決することができました。
“`:ターミナル
% rails db:migrate
== 20220310072650 DeviseCreateUsers: migrating ================================
— create_table(:users)
-> 0.0159s
— add_index(:users, :email, {:unique=>true})
rails aborted!
StandardError: An error has occurred, all later migrations canceled:
“`

【Rails】ソート機能の実装(星レビュー、投稿日順)

## はじめに
前回実装した星レビュー機能へ
星レビュー評価の高い順、投稿日が新しい古い順に並び替えできるように機能を追加していきます。

– 前回の記事

https://qiita.com/kcl215/items/e226ac58d14360fd1b8e

## 今回実装していく流れ

– モデルにカラムデータの取り出し方を指示する記述をする
– コントローラーのアクションを追記する
– ビューにソートするためのリンクを作る
– 日時を日本時間へ変更する

## 開発環境
– ruby 2.6.3p62
– Rails 6.1.4

## 完成図

![sort.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581621/d5a3dc62-e50e-f0ac-12fd-16908eccb416.gif)

## 1. モデルにカラムデータの取り出し方を指示する記述をする

`scope`ヘルパーを使って

“`diff_ruby:app/models/book.rb
class B