Rails関連のことを調べてみた

Rails関連のことを調べてみた

Docker + MySQL + Rails5環境でRailsコンテナが起動できない問題

# 環境
Ruby:2.4.6
Rails:5.2.8
MySQL:5.7

# 対処法
タイトルの通り、以下のコマンドを実行後にRailsコンテナが起動しない(Exit1)事態に陥りました。

“`
docker-compose up -d
“`
ログは次のようになります。
“`
web_1 | /usr/local/bundle/gems/loofah-2.21.1/lib/loofah/html4/document.rb:10:in `‘: uninitialized constant Nokogiri::HTML4 (NameError)
web_1 | Did you mean? Nokogiri::HTML
web_1 | from /usr/local/bundle/gems/loofah-2.21.1/lib/loofah/html4/document.rb:4:in `
web_1 | from /usr/local/bundle/gems/loofah-2.21.

元記事を表示

【3日目】フロントエンジニアがRailsを習得するまで

# 3章 ほぼ静的なページの作成

## railsの省略コマンド

“`
rails server -> rails s
rails console -> rails c
rails generate -> rails g
rails test -> rails t
bundle install -> bundle
“`

## `rails g` で作成したものをまとめて削除

`rails g` でmodelやcontrollerの命名を変更したい。
でも `rails g` は複数のファイルに変更を加えるので、修正が面倒。。

そういう時に使うのが `rails destroy` 。
このコマンドによって `rails g` で作成した各種変更を取り消してくれる。

### 1. Controllerを取り消す場合
`rails destroy` コントローラー名`

### 2. Modelを取り消す場合
`rails destroy モデル名`

### 3. migrateしたDBを戻す場合
`rails db:rollback`

#### ~

元記事を表示

なんでmodelで定義してるUserクラスをcontrollerで使えるの?

動機

Railsチュートリアル7章まで進めて、ふとこの疑問が湧き上がりました。
Rubyの基本的な文法を学習した段階では、

  • 原則同じファイル内で定義したクラスしか使えない
  • 外部のファイルのクラスを使う場合はrequireで読み込む必要がある
  • クラスの継承を使えば、親クラスのメソッドも使用できる

という理解だったのですが、railsチュートリアルのsample_appのusers_controller.rbのコードを見ると

  • ファイル内にUserクラスの定義がない
  • にもかかわらず@user = User.find(params[:id])みたいな感じでUserクラスを使ってる
  • requireで外部ファイルを読み込んでる、もしくはクラスを継承している様子もない

みたいな感じでなぜUserクラスが使えているのか理解できなかったので調べてみました。

<

元記事を表示

ReactとRailsアプリケーションにおける環境変数を無理やり共通化したかった

### 背景
この記事では、Reactをフロントエンドとして、Railsをバックエンドとして使用するアプリケーションの例を取り上げ、両者間での環境変数の共有方法について説明します。

## 問題の概要
ReactとRailsの両方で使用する環境変数がある場合、例えばAPIのエンドポイントやOAuthのクライアントIDなどがある場合に、これらの環境変数の管理が同期的である方が好ましいよな?(個人的な意見)と思いました。

## 考えた解決策
バックエンド(Rails)の .env ファイルから環境変数を読み取り、
それをフロントエンド(React)用の .env ファイルに転送するシェルスクリプトの作成。
この方法により、環境変数の一元管理が可能になりそうだと思った。

スクリプトの実装
“` shell
# バックエンドの .env ファイルのパス
BACKEND_ENV_PATH=”./backend/.env”

# フロントエンドの .env ファイルのパス
FRONTEND_ENV_PATH=”./frontend/.env”

# フロントエンドの .env ファイルをクリ

元記事を表示

public, private, protected

# それぞれの違い
## Public
Publicメソッドは、クラスの外部から自由にアクセス可能です。
これらはクラスのインターフェースを形成し、外部のコードから利用されることを意図しています。
Rubyでは、クラスで定義されたメソッドはデフォルトでpublicです(ただし、initializeメソッドは例外で、常にprivate)。

## Private
Privateメソッドは、そのクラスのインスタンスからのみアクセスできます。
これらのメソッドは、外部のクラスやサブクラスからは直接呼び出すことができません。
Privateメソッドは、レシーバを指定せずに呼び出す必要があります。つまり、selfを明示的に使用してはいけません。
これは、クラスの内部実装の詳細を隠蔽し、外部からの不要な干渉を防ぐために使用されます。

## Protected
Protectedメソッドは、同じクラスまたはサブクラスのインスタンスからアクセスできます。
これらは、外部のクラスからは直接アクセスできませんが、同じクラスまたはサブクラス内の他のインスタンスからはアクセス可能です。
Protectedメ

元記事を表示

依存関係逆転の原則

依存関係逆転の原則(Dependency Inversion Principle、DIP)は、ソフトウェア設計の原則の一つ。高レベルモジュールが低レベルモジュールに直接依存しないように設計することを意味する。代わりに、両方が抽象化に依存する。これにより、モジュール間の結合が緩やかになり、保守性や拡張性が向上する。

“`ruby:依存関係逆転の原則を使用していない
class EmailService
def send_email(user_email)
# 電子メール送信の実装
end
end

class UserAuthentication
def initialize(user_email)
@user_email = user_email
@email_service = EmailService.new
end

def authenticate
# 認証ロジック
email_service.send_email(@user_email)
end
end
“`

“`ruby:依存関係逆転の原則を使用
#

元記事を表示

インターフェイス分離の原則

インターフェイス分離の原則(Interface Segregation Principle, ISP)は、ソフトウェア設計の原則の一つで、SOLID原則の一部である。この原則は、「クライアントは使用しないメソッドに依存するべきではない」という考え方に基づいている。つまり、大きくて汎用的なインターフェイスよりも、小さくて特定のクライアントに特化したインターフェイスを設計するべきであるという原則です。

“`ruby:違反している
class DocumentGenerator
def generate_pdf
# PDFドキュメント生成のロジック
end

def generate_word
# Wordドキュメント生成のロジック
end

# 他のドキュメントタイプの生成メソッドもここに含まれる
end

“`
違反理由
DocumentGeneratorクラスにgenerate_pdfとgenerate_word というメソッドが両方とも含まれている場合、特定のレポート(例えばPDFレポート)にのみ関心があるクライアントが Report クラス

元記事を表示

リスコフの置換原則

# リスコフの置換原則とは?
リスコフの置換原則(Liskov Substitution Principle, LSP)は、オブジェクト指向プログラミングにおける重要な原則の一つで、サブクラスはいつでもそのスーパークラスの代わりとして使用できるべきであるという規範のこと。これは、サブクラスがスーパークラスの契約を変更しないようにすることを意味する。

“`ruby:リスコフの置換原則を使用した例
# 基底クラスの作成
class Payment
# このメソッドはすべての支払い方法で共通です。
# 各支払い方法はこのメソッドを実装する必要があります。
def process
raise NotImplementedError, “process method must be implemented”
end
end

# サブクラスの作成
class CreditCardPayment < Payment def process # クレジットカードでの支払い処理のロジック "Processing credit card payment..

元記事を表示

オープン・クローズドの原則

# 概要
オープン・クローズドの原則の定義は「拡張に対して開かれているべきであり、変更に対しては閉じているべき」と、よくそのように言われます。

しかし、一見すると主語が書いてないので、拡張も変更も同じ主語を持つとした場合、矛盾してしまいます。

これは厳密にいうと、既存のコードの変更に対しては閉じているべき(=変更せずにいられるべき)で、拡張に対して開かれているべき(=新機能の追加をしやすくあるべき)である。つまり、既存のコードを変更せずに、新しい機能を追加できるような設計が望ましいということです。

# つまり、どういうことだってばよ?
## ダックタイピングで実装した例
“`ruby:オープン・クローズドの原則に違反した実装(変更に閉じていない)
class PaymentProcessor
def process_payment(payment_type, amount)
case payment_type
when :credit_card
# クレジットカードでの支払い処理
when :paypal
# PayPalでの

元記事を表示

単一責任の原則

# 1. 序論
## 単一責任の原則とは?
Wikipediaによると
> 単一責任の原則 (たんいつせきにんのげんそく、英: single-responsibility principle) は、プログラミングに関する原則であり、モジュール、クラスまたは関数は、単一の機能について責任を持ち、その機能をカプセル化するべきであるという原則である。モジュール、クラスまたは関数が提供するサービスは、その責任と一致している必要がある。

単一責任の原則の説明としてよく用いられる例が十徳ナイフなので、十徳ナイフを用いて単一責任の原則の説明を行う。

十徳ナイフ
![166003020_2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/270132/298d5f48-d910-20c3-3c7d-2da83d89b37f.jpeg)

十徳ナイフはナイフに缶切り、マイナスドライバーに栓抜きと、多機能に展開されている。これをソフトウェア設計の視点で見ると、十徳ナイフという1つのオブジェクトに対して責任(=役割)が複

元記事を表示

docker-compose build はやりたくない rails

## はじめに
今回、ruby on rails を勉強のためdocker上で環境構築して学習しているのですが、

章が変わるごとにgemを追加して、docker-compose buildで2時間近くかかって、全然学習にならなかったので改善できないか調べて取り組んでみました

## 結論
docker-compose のvolumesを使えばできた。

“`diff_yaml
version: ‘3’
services:
web:
volumes:
– .:/app
+ – bundle:/usr/local/bundle
volumes:
+ bundle:
“`

## 概要
* PC : M1 Macbook
m1 Macbookは通常と違う点が多いのでご注意を。

ファイル構造
“`:現在のディレクトリ

rails
├─ Dockerfile
├─ Gemfile
└─ docker-compose.yml

“`

* Dockerfile
* Gemfile
* docker-compose.yml

“`:

元記事を表示

Rails環境でRakeタスク作成~テストまで

## モチベーション
Rakeタスクを作成に伴い、どのように利用するかを知ること!

## Rakeタスクって?

> Rake ファイルにおける基本単位です。タスクは名前と、事前タスクと、実行するアクションのリストを持ちます。
>

https://docs.ruby-lang.org/ja/latest/library/rake.html

RakeというRubyで書かれたビルドツール利用される基本単位のことらしいです。

`***.rake` というファイル名でRubyスクリプトを実装し、Rakeタスクとして実行することができます。

## ユースケース

下記のユースケースが考えられます。

– Railsのアプリケーションコードを利用した、一回だけ実施したい処理
– バッチなどの定期実行処理

## 利用方法

`namespace:task_name` の形式で呼び出すことができます。

“`zsh
# 引数なしの呼び出し方
bin/rake ‘test:argument_parse’

# 引数ありの呼び出し方
bin/rake ‘test:argument_pars

元記事を表示

CarrierwaveとMiniMagickを使った画像アップロード機能

# Carrierwaveとは

ファイルアップロード用のgem

# MiniMagickとは

画像加工をしてくれるgem
・画像サイズ変更
・画像反転
・画像回転
・画像フォーマット変換
・色調整
・グラデーション

# 導入方法
## 1.gem導入
“`terminal:Gemfile
gem ‘carrierwave’
gem ‘mini_magick’
“`
## 2.アップローダークラス作成
“`terminal
rails g uploader image(アップローダー名)
“`
## 3.マイグレーションファイル作成とカラム追加
もし紐づけるマイグレーションファイルを作成していない場合、作成する
“`terminal
rails g migration add_image_to_posts image:string
rails db:migrate
“`

## 4.モデル編集
画像を保存するmodelにアップローダーを紐づける
postのdbにはファイル名だけが保存される。
“`ruby:post.rb
# 追記
class Post < App

元記事を表示

CarrierWaveでアップロードした画像を絶対パスで返す設定

CarrierWaveで画像アップロード機能を実装していたのですが、
レポジトリをバックエンドとフロントエンドで分離していて、バックエンド側に仮で画像を保存したかった際、
バックエンドから返ってくるpathがデフォルトだと相対パスで少しつまづいたので
相対パスの絶対パスにする方法を残しておきます。

# image_uploader.rbの設定
デフォルトだと以下のようになっているかと思います。
これだけだと相対パスが返されます。
“`ruby:image_uploader
def store_dir
“uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}”
end
“`
絶対パスにするには、image_uploaderにhostのpathの設定を追加します。
“`ruby:image_uploader
def store_dir
“uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}”
end

元記事を表示

【個人開発】健康的に太りたい人をサポートするサービス「Fat Recipe」をリリースしました!

# はじめに
こんにちは!@hamusan44と申します。
この度、プログラミングスクール「RUNTEQ」を卒業し、健康的に太りたいが何を食べればいいか悩む人向けにサポートするAI×レシピ提供サービス「Fat Recipe」をリリースいたしました!

:::note warn
まだまだ初学者のため、間違った情報があればコメントなどで教えていただけると幸いです。
:::

# サービス名:「Fat Recipe」
![スクリーンショット 2023-11-30 16 39 46](https://github.com/sakamoto-kohei-44/Fat-Recipe/assets/130162997/d5e5b684-da65-4da6-9b00-93fedc7483b0)
▼サービスURL(独自ドメイン対応中です):https://fat-recipe-af94f33f2e6f.herokuapp.com

▼Github:https://github.com/sakamoto-kohei-44/Fat-Recipe

▼告知ツイート:https://twitter.com/ha

元記事を表示

【Ruby・Rails】ダックタイピング

# ダックタイピングとは?

ダックタイピングはRubyのような動的型付け言語でよく使われるプログラミングの概念です。この概念は、「もしオブジェクトがカモのように歩き、カモのように鳴くなら、そのオブジェクトはカモである」という考え方に基づいています。つまり、オブジェクトの型よりも、そのオブジェクトがどのようなメソッドを持っているか(どのように「振る舞う」か)が重要とされます。

“`ruby:ダックタイピングを使った例
# オブジェクトの型よりも、そのオブジェクトがどのようなメソッドを持っているか
# Duck, Lion, Sheep, Zekromはそれぞれquackというメソッド・振る舞いを持っている状態
class Duck
def quack
“クワ!”
end
end

class Lion
def quack
“ガオー”
end
end

class Sheep
def quack
“メェメェ”
end
end

class Zekrom
def quack
“ババリバリッシュ!!”
end
end

du

元記事を表示

【Docker Rails】HerokuのclearDBのIgniteプランが終了するそうなので、renderに移行した話

## 前提
最近、こんなメールが届きました。

>Dear Valued ClearDB Customer,
We are improving and modernizing our ClearDB platform. As result, the Ignite Plan that you are currently subscribed to will be retired on January 15th, 2024. If you would like to continue using ClearDB MySQL databases, you will need to upgrade to the Punch Plan which is $9.99 per month.

翻訳
>ClearDBをご愛顧いただいている皆様へ、
弊社は ClearDB プラットフォームの改善と近代化を進めております。そのため、現在ご契約いただいている Ignite プランは 2024 年 1 月 15 日に終了いたします。引き続きClearDB MySQLデータベースをご利用になりたい場合は、月額

元記事を表示

railsのroutes.rbとは

# はじめに
最近railsを勉強し始めて、routes.rbの書き方を自分に中で復習したかったので、ここでまとめてみます
## routes.rbとは
railsのroutes.rbとは、ブラウザから届いたリクエストに対して、コントローラーで定義したアクションを結びつけるための書くファイルのこと

具体的なコードを書いてみると以下のような感じ
“`routes.rb
Rails.application.routes.draw do
root “static_pages#home”
get “/help”, to: “static_pages#help”
post “/login”, to: “sessions#create”
delete “/logout”, to: “sessions#destroy”
end
“`
root,get,post,deleteなど色々書いてありますが、詳しく中を確認していきます
### rootとは(コード:1行目) 
“`rb
root “static_pages#home”
“`
誰か

元記事を表示

Railsの命名規則

### -命名規則が必要な理由-
1. 命名を制限してプログラマの揺らぎを減らすため。
→開発者をあえて縛って、迷いにくく手間も少ない開発環境を実現するため。

1. 名前から意味を把握するできるようにする。
→コードを読むのに文中に登録する要素の中身がある程度推測できれば、可読性をあげる。

#### Modelの命名規則
**Model名**

単数形で、
コード中 = **キャメルケース**
ファイル名 = **スネークケース**
になります(Rubyのクラス名の命名規則と同じ)。

キャメルケース
→単語の頭文字を大文字・それ以外を小文字で記述する表記法です。
例:`Book`,`MyName`など

スネークケース
→単語をすべて小文字にし、単語の区切りを_で記述する表記法です。
例:`book`,`my_name`など

**Modelの属性名**
**キャメルケース**で記述します。

ActiveRecordの予約語は避けてください。
例:`type`など。

誤作動を起こす可能性があります。

制約ではありませんが、日時型の属性は`_at`に命名するのが基本です。

元記事を表示

text型のindex設定時は長さを指定する

# 前提
– Rails 7.0.4
– MySQL8系(docker)

# エラー内容
text型のindex設定でマイグレーションしたら

“`
add_index :table_name, [:not_text_column, :text_column]
add_index :table_name, :text_column
“`

エラーが起きた

“`

rails aborted!
StandardError: An error has occurred, all later migrations canceled:

Mysql2::Error: BLOB/TEXT column ‘normalized_value’ used in key specification without a key length

Caused by:
ActiveRecord::StatementInvalid: Mysql2::Error: BLOB/TEXT column ‘normalized_value’ used in key specification wi

元記事を表示

OTHERカテゴリの最新記事