- 1. 動機
- 1.0.1. Rubyのバージョンが勝手に元に戻る現象を解消する
- 1.0.2. Rubyの「後置if」をElixirマクロで実装する
- 1.0.3. Rubyのインストール方法(MacOS編)
- 1.0.4. ReactとRailsアプリケーションにおける環境変数を無理やり共通化したかった
- 1.0.5. public, private, protected
- 1.0.6. 依存関係逆転の原則
- 1.0.7. インターフェイス分離の原則
- 1.0.8. リスコフの置換原則
- 1.0.9. オープン・クローズドの原則
- 1.0.10. 単一責任の原則
- 1.0.11. Rails環境でRakeタスク作成~テストまで
- 1.0.12. 【個人開発】健康的に太りたい人をサポートするサービス「Fat Recipe」をリリースしました!
- 1.0.13. 【Ruby】Ruby silver合格までの流れをまとめてみた【2023】
- 1.0.14. 【Ruby・Rails】ダックタイピング
投稿機能の検索機能の実装
検索機能は必須機能ではないですがあると便利ですね!
テックキャンプの備忘録です!### 目的
– ルーティングのcollectionとmemberを理解
– 検索に必要なメソッドを理解### seachアクションのルーティング設定
#### collectionとmember
ルーティングを設定する際に使用でき、生成されるルーティングのURLと実行されるコントローラを任意でカスタムできる
ルーティングに`:id`がつくかつかないかの違い
config/routes.rb
“`ruby
Rails.application.routes.draw do
devise_for :users
root to: ‘tweets#index’
resources :tweets do
resources :comments, only: :create
collection do
get ‘search’
end
end
resources :users, only: :show
end
“`### 検索フォーム作成
app
jbuilderでJSONを生成する
# はじめに
jbuilder は、Ruby on Rails で JSON を生成するための Gem です。
この記事では、jbuilder の基本的な使い方をまとめてみました。# 環境設定
### Gem のインストール
Gemfile に jbuilder を追加するために、以下の行を追記します。
“`ruby:Gemfile
gem ‘jbuilder’
“`その後、以下のコマンドを実行して、Gem をインストールします。
“`bash
bundle install
“`# 使い方
### controller ファイルの設定
コントローラーで、JSON 形式でデータを返すように設定します。
例えば、[respond_to](https://railsdoc.com/page/respond_to)メソッドを使用して、JSON 形式のレスポンスを許可することができます。“`ruby:app/controllers/UsersController.rb
class UsersController < ApplicationContro
Ruby on Railsにおける秘匿データの扱い:メリット、デメリット、および管理方法
#### 秘匿データとは?
Railsアプリケーションでは、APIキー、データベースのパスワードなど、外部に漏れるとセキュリティ上のリスクが高まる情報を「秘匿データ」と呼びます。これらは通常、ソースコードとは別に安全に管理する必要があります。#### 管理方法の選択肢
1. **環境変数 (ENV)**
2. **Rails Credentials**## 環境変数 (ENV)
– **メリット:**
– 簡単に設定でき、多くのホスティングサービスがサポート。
– ローカルと本番環境で異なる値を設定しやすい。– **デメリット:**
– 環境によって設定方法が異なる可能性がある。
– アプリケーションが多くなると管理が煩雑に。## Rails Credentials
– **メリット:**
– ファイル内にすべての秘匿情報を集約できる。
– 暗号化されているため、安全性が高い。– **デメリット:**
– `master.key` の管理が必要であり、これが漏れるとセキュリティリスクに。
– 初期設定が環境変数よりも複雑。## ど
DockerでRails7.1.2×PostgreSQLの環境構築
# はじめに
今回は初めてDockerを使って環境構築してみたので、そのまとめを残していきたいと思います。https://github.com/docker/awesome-compose/tree/master/official-documentation-samples/rails
こちらのリポジトリを参考に
– Ruby: 3.3.0
– Rails: 7.1.2
– wsl2
– Docker Desktopインストール済み
– composeでsecretsを使うで環境構築しました。
# 環境構築のステップ
まずはファイルを6つ用意します。
– Dockerfile.dev
– compose.yaml
– Gemfile
– Gemfile.lock
– entrypoint.sh
– db_passwordそれぞれ中身を見ていきましょう。
まずは`Dockerfile.dev`から、名前はなんでもいいのですが、Rails7.1以降の仕様から.devをつけています。
“`Dockerfile:Dockerfile.dev
# syntax=docker/d
`gem install middleman` を実行するとエラー 「ERROR: Failed to build gem native extension.」
# TL;DR
`sudo apt install build-essential` で解決した。
# 環境
* Ubuntu 22.04
* Ruby 3.0.2p107 (Ubuntu 22.04 標準)# 発生した事象
`sudo gem install middleman` を実行したところ、エラーが発生した。
“`console
$ sudo gem install middleman
Fetching backports-3.24.1.gem
Fetching addressable-2.8.6.gem
Fetching activesupport-7.0.8.gem
Building native extensions. This could take a while…
ERROR: Error installing middleman:
ERROR: Failed to build gem native extension.current directory: /var/lib/gems/3.0.0/gems/ffi-1.16.3/e
なんでmodelで定義してるUserクラスをcontrollerで使えるの?
動機
Railsチュートリアル7章まで進めて、ふとこの疑問が湧き上がりました。
Rubyの基本的な文法を学習した段階では、
- 原則同じファイル内で定義したクラスしか使えない
- 外部のファイルのクラスを使う場合はrequireで読み込む必要がある
- クラスの継承を使えば、親クラスのメソッドも使用できる
という理解だったのですが、railsチュートリアルのsample_appのusers_controller.rbのコードを見ると
- ファイル内にUserクラスの定義がない
- にもかかわらず@user = User.find(params[:id])みたいな感じでUserクラスを使ってる
- requireで外部ファイルを読み込んでる、もしくはクラスを継承している様子もない
みたいな感じでなぜUserクラスが使えているのか理解できなかったので調べてみました。
<
Rubyのバージョンが勝手に元に戻る現象を解消する
# はじめに
:::note info
本記事は、下記記事内「バージョンが変わらない場合」を実施しても解消されない方向けです。
:::https://qiita.com/Ficus/items/bdef5c2b504d7a4008fb
# 現状
mac購入時からデフォルトでインストールされているRubyのバージョンを最新版に更新。
しかし、ターミナルを開き直すとバージョンが更新前に戻る。
“`
Last login: Tue Jan 2 00:14:52 on ttys000
% ruby -v
ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.arm64e-darwin22]
“`# 目標
ターミナルを開き直しても、更新後のバージョンが認識されること。# 対象
mac購入後、初めてローカルのRubyを触る方向け。# 結論
ターミナルがzshの場合、`.zshrc`ファイルをいじる必要があった。
(上記記事ではターミナルがbashだから成功している)zshとbash?何それ美味しいの?と
Rubyの「後置if」をElixirマクロで実装する
この記事は、[Elixir Advent Calendar 2023 シリーズ13](https://qiita.com/advent-calendar/2023/elixir) の13日目です
—
【本コラムは、30分で読め、30分で試せます】
[piacere](https://twitter.com/piacere_ex) です、ご覧いただいてありがとございます :bow:
Rubyは、下記のように「後置 `if`」が書けます
“`diff_ruby:実行
irb> name = “hoge”
irb> id = :id001
irb> name = “piacere” if id == :id001
irb> name
“piacere”irb> id = :id002
irb> name = “piacere” if id == :id001
irb> name
nil
“`これをElixirでも追加してみます
なお、こうしたDSL(Domain Specific Language:ドメイン固有言語)は、マクロを使って実装するのが通例なので、[**
Rubyのインストール方法(MacOS編)
# 実際の環境
以下の環境で実際に環境構築をしてインストールができていることを確認しました。
“`shell
macOS Sonoma 14.0
zsh 5.9 (x86_64-apple-darwin23.0)
homebrew 4.2.1
“`macOSではOS標準のrubyがすでにインストールされていることがほとんどです。これは以下のコマンドで確認できます。
“`shell
ruby -v
“`しかし、macOS標準のrubyでは以下のような問題が発生してしまいます。
– versionの変更が難しい
– 最新のversionにupdateできない
– 外部ライブラリのインストールでトラブルが起きるそこで今回はversionのコントロールがしやすいrubyをhomebrew経由でインストールしたいと思います。homebrewはすでにインストールされていることを想定します。
# 1. rbenvのインストール
rbenvとはrubyのversion管理ツールです。これを用いることで、1つのパソコンで複数のrubyのversionを扱うことができます。実際
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
endclass UserAuthentication
def initialize(user_email)
@user_email = user_email
@email_service = EmailService.new
enddef authenticate
# 認証ロジック
email_service.send_email(@user_email)
end
end
“`“`ruby:依存関係逆転の原則を使用
#
インターフェイス分離の原則
インターフェイス分離の原則(Interface Segregation Principle, ISP)は、ソフトウェア設計の原則の一つで、SOLID原則の一部である。この原則は、「クライアントは使用しないメソッドに依存するべきではない」という考え方に基づいている。つまり、大きくて汎用的なインターフェイスよりも、小さくて特定のクライアントに特化したインターフェイスを設計するべきであるという原則です。
“`ruby:違反している
class DocumentGenerator
def generate_pdf
# PDFドキュメント生成のロジック
enddef 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つのオブジェクトに対して責任(=役割)が複
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
【個人開発】健康的に太りたい人をサポートするサービス「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】Ruby silver合格までの流れをまとめてみた【2023】
## はじめに
同じような記事がたくさんありますが、自身の成長記録として書き残そうと思います。
(また、現時点では最新なので誰かのお役に立てば幸いです)## 受験者スペック
・プログラミング歴:約1年
・Ruby歴:同上
・Ruby使用頻度:業務で毎日## 所要時間
・約3週間
(内訳)
▫️参考書1週間(平均30分/日)
▫️模擬問題2週間(模擬問題1周/日ペース)
・集中して時間を取ればRubyやってる人なら2週間ぐらいで合格できるかと思います。## 実際にやった勉強法
#### 参考書
・試験用の[参考書](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-Ruby%E6%8A%80%E8%A1%93%E8%80%85%E8%AA%8D%E5%AE%9A%E8%A9%A6%E9%A8%93%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-Silver-Gold%E5%AF%BE%E5%BF%9C-Ruby%E5%85%AC%E5%BC%8F%E8%B3%87%E6%A0%BC%E6
【Ruby・Rails】ダックタイピング
# ダックタイピングとは?
ダックタイピングはRubyのような動的型付け言語でよく使われるプログラミングの概念です。この概念は、「もしオブジェクトがカモのように歩き、カモのように鳴くなら、そのオブジェクトはカモである」という考え方に基づいています。つまり、オブジェクトの型よりも、そのオブジェクトがどのようなメソッドを持っているか(どのように「振る舞う」か)が重要とされます。
“`ruby:ダックタイピングを使った例
# オブジェクトの型よりも、そのオブジェクトがどのようなメソッドを持っているか
# Duck, Lion, Sheep, Zekromはそれぞれquackというメソッド・振る舞いを持っている状態
class Duck
def quack
“クワ!”
end
endclass Lion
def quack
“ガオー”
end
endclass Sheep
def quack
“メェメェ”
end
endclass Zekrom
def quack
“ババリバリッシュ!!”
end
enddu