- 1. 実務未経験の初心者がRailsを学習してみた
- 2. PythonエンジニアがRubyでスクレイピングをしてみた
- 3. Ruby エイリアスメソッド
- 4. 低凝集について学んだことをRubyコードに落としてみる
- 5. 条件文のリファクタリング-ポリシーパターン
- 6. DockerのHealthCheckでコンテナの実行順序を制御する。
- 7. 基礎知識④Active Recordについて
- 8. Rubyのoptparseの使い方をわかりやすく解説
- 9. 基礎知識③HTTPについて
- 10. 基礎知識②ルーティングについて
- 11. 他の言語からRubyを学ぶならTry Rubyがオススメ!
- 12. 基本知識①MVCモデルとは
- 13. Dockerを使ってRails7.1環境の構築をしてみる
- 14. Web API 混在の Rails アプリケーションで500エラーを適切に処理したい
- 15. gemが上手く動作せず、gemの内部処理でデバッグしたい/モンキーパッチを作りたいときのやり方
- 16. after_saveでsidekiqを叩いてもデータが存在しない
- 17. 【Ruby】文字列演算子
- 18. 【Ruby】文字列をスペースで区切って配列にし、配列の要素を取り出す。
- 19. SHA-1で作成したsigned_idをRails 7.0でもfind_signedで検索できるようにする
- 20. 【Ruby】each処理を簡潔に書く
実務未経験の初心者がRailsを学習してみた
# ① はじめに
初投稿になります🌷
IT業界に未経験で転職して約1週間が経過し、
元々HTML/CSSの知識がごく僅かしかない私が、Ruby on Railsを学習してみました。
特に重要だなと思ったところや、自分の中で引っかかったところを中心にアウトプットしていきます!# ② 使用した教材
今回はudemyの、
[はじめてのRuby on Rails入門-RubyとRailsを基礎から学びウェブアプリケーションをネットに公開しよう](https://www.udemy.com/course/the-ultimate-ruby-on-rails-bootcamp/?couponCode=KEEPLEARNING) を使って勉強しました。![スクリーンショット 2024-06-10 13.29.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3812430/7b404efc-7a79-8e27-f512-3662d2b67786.png)
PythonエンジニアがRubyでスクレイピングをしてみた
# はじめに
普段、Pythonでコードを書いていますが、最近Rubyにも興味を持ち始めました。
言語によって同じコードでどのくらい違いがあるのか気になったので、RubyとPythonで`Selenium`を使った同じスクレイピングを行ってみました。
学習のためのアウトプットなので、間違い等あれば指摘していただけると幸いです。# Rubyのスクレイピング
## 1. パッケージのセットアップ
“`shell
gem install selenium-webdriver
“`## 2. コード
“`ruby
require ‘selenium-webdriver’options = Selenium::WebDriver::Chrome::Options.new
options.add_argument(‘–headless’)
driver = Selenium::WebDriver.for(:chrome, options: options)driver.navigate.to ‘https://qiita.com’
puts driver.title
Ruby エイリアスメソッド
# エイリアスメソッドについて
Rubyには全く同じ機能でありながら異なる名前のメソッドが複数存在します。これらのメソッドのことをエイリアスメソッドと呼びます。
可読性向上やプログラマーの好みによって使い分けられています。(メソッドによっては派閥がわかれているとか…)以下にエイリアスメソッドの一例を記載します。
# エイリアスメソッド一覧
## Array クラス
– `map` と `collect`
– `size` と `length`
– `slice` と `[]`
– `append` と `push`
– `prepend` と `unshift`## Hash クラス
– `store` と `[]=`
– `size` と `length`
– `key` と `index`
– `to_s` と `inspect`## String クラス
– `size` と `length`
– `slice` と `[]`
– `to_s` と `to_str`## Enumerable モジュール
– `collect` と `map`
– `f
低凝集について学んだことをRubyコードに落としてみる
ミノ駆動さんが書かれた「良いコード/悪いコードで学ぶ設計入門 」という書籍の**低凝集**について、自分が理解しやすいRubyのコードに落したものを書いていきます。
自己理解を目的としているのでメモ程度に雑に書いていきます。## Staticメソッドの誤用
Staticメソッドは、クラスのインスタンスに依存しない処理を定義する際に便利ですが、これを乱用するとクラスの凝集度が低下します。以下は、誤ったstaticメソッドの使用例です。“`ruby
class Utility
def self.calculate_sum(numbers)
numbers.reduce(:+)
enddef self.format_date(date)
date.strftime(“%Y-%m-%d”)
enddef self.send_email(to, subject, body)
# 仮のメール送信処理
puts “Sending email to #{to}: #{subject}\n#{body}”
end
end
“`
条件文のリファクタリング-ポリシーパターン
特定の処理を実行するための条件がコンテキスト毎に異なる場合のリファクタリング作業で、ポリシーパターンの「条件をクラス化する」という考え方がとても役立ったので紹介します。
参考にした書籍はこちら
良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方
## 例)キャンペーン機能
キャンペーン機能の仕様として、以下の項目があるとします。
1. キャンペーンにはカテゴリーが存在する
1. キャンペーンの様々な処理はカテゴリー毎に異なる(部分的に一致しているものもある)
例として、キャンペーンの参加条件について考えます。
カテゴリーが normal のキャンペーンは以下のように実装されているとします。
joinable? メソッドは、キャンペーンに参加できるかどうかを真偽値で返します。
以下の全てを満たすときに true を返します。
– 有料化員である
– キャンペーンを達成していない
– キャンペーンに参加していない“`ruby
class Campaign::Normal
def initialize(campaign)
@cam
DockerのHealthCheckでコンテナの実行順序を制御する。
## はじめに
プログラミング学習コミュニティ「progaku」で行っているチーム開発で取り組んだ内容になります。## コンテナの実行順序の制御が必要になった場面
Dockerで環境構築を行い、初めてDB作成のコマンド実行する際に以下のようなエラーが発生
“`
docker compose run backend rails db:create
“`エラー内容
“`terminal
[+] Building 0.0s (0/0) docker:desktop-linux
[+] Creating 3/0
✔ Network [ネットワーク名] Created
基礎知識④Active Recordについて
## はじめに
転職活動をする中で、MVCそれぞれの役割やhttp通信についてなど、基礎的な技術知識について問われるシーンがあったので、改めて基本に立ち返って自己学習しようと思った。出題例にActive Recordについての質問があり、
そういえばちゃんと説明できないな〜…と思ったので学習内容をまとめる。## Active Recordとは
Ruby on Railsで使用されるデザインパターンの一つで、**DBとのやり取りを簡素化してくれる**もの。
本来DBとやり取りをするためにはDB言語であるSQLが使われますが、
RailsにはこのActive Recordが適用されているため、
複雑なSQL文を書かなくてもRubyで直感的にDBとのやり取りを記述することができる。### Active Recordで出来る主なこと
– CRUD機能のサポート
Create Read Update Deleteといった基本的なデータ処理機能を
メソッドを用いて簡単に行うことができる。
– モデル同士のアソシエーション
異なるモデル間を結ぶことができます。
ex)1ユー
Rubyのoptparseの使い方をわかりやすく解説
Rubyでコマンドライン引数を扱いたい場合、どのように実装したら良いでしょうか?
Rubyでは、そうした場合に使える標準ライブラリとして「optparse」というライブラリが用意されています。optparseを使えば、複雑なコマンドライン引数の定義と解析を簡単に行うことができます。
本記事では、optparseの基本的な使い方をどこよりも分かりやすく解説したいと思います。## optparseの基本的な使用の流れ
Rubyのリファレンスを見ると、optparseを使用する流れについて以下のように書かれています。1. OptionParserオブジェクトoptを生成する
2. オプションを取り扱うブロックをoptに登録する
3. opt.parse(ARGV) でコマンドラインを実際に解析するこれらのステップにより、コマンドライン引数の処理を簡単に実装することができるのですが、そもそもoptparseを初めて使用する人にとっては、この流れだけを見てもさっぱり分からないと思いますので、以下のサンプルコードを使って、各ステップの内容を具体的に説明していきます。
“`ruby
基礎知識③HTTPについて
## はじめに
転職活動をする中で、MVCそれぞれの役割やhttp通信についてなど、基礎的な技術知識について問われるシーンがあったので、改めて基本に立ち返って自己学習しようと思った。## HTTPリクエストとHTTPレスポンスについて
– HTTPリクエスト
ユーザーがブラウザ(PC上で見ている画面)からサーバー(サイトページの情報が存在するコンピュータ)へ送るもの
– HTTPレスポンス
ブラウザから送られてきたリクエストに応じた情報を返す(レスポンス)ことユーザーがブラウザを通じてサーバーに「このページが見たいよ〜」とリクエストし、
そのページの情報をレスポンスするというのが一連の流れですね。## HTTPメソッドとは
クライアントからサーバーへ「なんの要求なのか」を伝えるメソッド– GET
サーバーにリクエストを送る時に使うメソッド。
リクエストの内容に沿って、サーバー側で情報を検索して取得することができる。
リクエストの内容はURLにクエリとして含まれる。
そのため、キャッシュカードの情報や個人情報など機密データを取り扱う場合はおすすめしない🙅♀️
リクエスト
基礎知識②ルーティングについて
## はじめに
転職活動をする中で、MVCそれぞれの役割やhttp通信についてなど、基礎的な技術知識について問われるシーンがあったので、改めて基本に立ち返って自己学習しようと思った。### ルーティングとは
どのURLにどのようなHTTPメソッドでアクセスがあった場合にどのコントローラのどのアクションを呼び出すかを定義したもの
アクセスを受けてどのアクションへ案内する仕組み### ページを作る流れについて
基本的にはルーティング→コントローラ→(モデル)→ビュー
モデルは必要な時とそうでない時があるので適宜– ルーティング
アクセスがあった際に、どのコントローラのどのアクションを実行するかを定義した案内板、対応表– コントローラ
モデルとビューを仲介する役
ビューからの入力、データ更新、削除などの操作に応じてモデルに依頼。
モデルで処理されたデータをビューに渡す。– モデル
データベースの操作を担当。
データの登録、更新、削除を行い、処理された結果をコントローラに返す。– ビュー
ビューに書いてあることをHTMLファイルとして表示。
システムにおけるユーザーイン
他の言語からRubyを学ぶならTry Rubyがオススメ!
ある日、業務でRubyを使うことになり、Rubyを学ぶ方法を探していたところ、Ruby公式サイトで非常に役立つリソースを発見しました。それが [Try Ruby](https://try.ruby-lang.org/) です。他の言語をある程度触ったことがある人にとってTry RubyがRubyを最短で学ぶのに最適なツールだと思います!
## Try Rubyとは?
[Try Ruby](https://try.ruby-lang.org/) は、ブラウザ上でインタラクティブにRubyを学ぶことができる無料のチュートリアルサイトです。
## いいところ
### 簡単に始められる
他の言語を学んだ経験がある方なら、最初に環境構築に苦労したことがあるかもしれません。しかし、Try Rubyならブラウザだけで完結するため、
インストールや設定は一切不要で、すぐに始められます!### 可愛いイラスト
![try ruby](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/737177ac-c6
基本知識①MVCモデルとは
## はじめに
転職活動をする中で、MVCそれぞれの役割やhttp通信についてなど、基礎的な技術知識について問われるシーンがあったので、改めて基本に立ち返って自己学習しようと思った。## MVCについて
### 「MVCモデル」とは
システム開発の方針の一つ。
「Model」「View」「Controller」の3つに役割を分担させコードを管理する。#### なぜ分けるのか?
1. 保守性の向上
コードを役割ごとに分けることで、システムにバグが起こった時、バグ発生箇所を特定しやすい。
また、例えばViewでバグがあったとして、ControllerやModelに影響が少なく、影響範囲を小規模で止めることができる。2. 生産性の向上
コードが役割ごとに独立しているため、管理がしやすい。
分担作業がしやすい。### Modelとは
**表示や入力に関連しない処理**
DBとのやりとりを担当。
データの登録・更新・削除の処理を担う。
処理したデータはControllerに送る。### Viewとは
**表示や入力に関する処理**
HTMLなど、ユーザーが実際目にするページの
Dockerを使ってRails7.1環境の構築をしてみる
Railsで学習をする機会があったので、7.1の環境を自身のPCに作ってみたので
構築方法を記録する。(環境)
Mac(バージョン:14.5 チップ:Apple M2)(構築)
Rails:7.1.3
Ruby:3.3.2
MySQL8.0## memo
* Rails7になってWebPackが不要になった
* 途中でDockerfileが書き換わるので、build前にDockerfileを一部変更した# 1.Docker for Macのインストール
(インストール済みならスキップ)
https://docs.docker.com/compose/install/# 2.Rails / MySQLアプリケーションを設定
## 2-1.ファイル用意
開発していくディレクトリにアプリケーションを構築するために必要な4つのファイルを設定する。
“`
{プロジェクト}
|_Dockerfile
|_Gemfile
|_Gemfile.lock
|_entrypoint.sh
|_docker-compose.yml
“`
Web API 混在の Rails アプリケーションで500エラーを適切に処理したい
## はじめに
Rails で、Web API でJSONを返すものと、HTMLのページを返すものを混在させたアプリケーションを `rails new` で作成していました。
routing で、Web API は、 `/api` 以下にマウントしていました。
`/api/xxx` で Web API が呼ばれて想定外のエラーが発生した時、JSON でレスポンスを返すようにしたいと考えたのですが、意外に手間取ったので自分用にメモしておきます。
なお、動作確認は、Rails7.1 で実施しています。
## 500エラーを発生させる
意図的に 500 エラーを発生させるために、Controller で以下のようなコードを書きます。“`ruby
class Api::UsersController < ApplicationController def index raise StandardError, 'error' end end ``` ## 何もしない場合 何もしない場合、Rails は、`/500.html` を返します。JSON ではなくて、H
gemが上手く動作せず、gemの内部処理でデバッグしたい/モンキーパッチを作りたいときのやり方
gemの怪しいと思った部分をoverwriteして、binding.pryを追加すれば、追加した場所で止まってくれます。
overwriteのやり方
https://qiita.com/arakaji/items/dbf26f0b1d1c4659ef32#%E3%82%AA%E3%83%BC%E3%83%97%E3%83%B3%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%86
after_saveでsidekiqを叩いてもデータが存在しない
# はじめに
E2Eがコケて原因が謎だったところについてまとめておきます
# 問題
ユーザーをDBに保存すると、Sidekiqのジョブを叩くような実装をしました
“`rb:user.rb
after_save TriggerIndexingCallbacks
“`しかしジョブでは作成したユーザーが存在しませんでした
# 解決方法
“`rb:user.rb
after_commit TriggerIndexingCallbacks
“``after_commit`にすることでDBに保存してから実行されるようになりました
保存前に動いていたのが原因でした# おわりに
初めてafter_commitというものを使いました
そもそも知らなかったです
【Ruby】文字列演算子 <<
## 概要
この記事では、`<<` 演算子を使用した文字列の連結方法について詳しく見ていきます。## 文字列連結方法
Rubyでは文字列の連結にいくつかの方法があります、一般的なのが `+` 演算子、
次に今回の記事のお題にもなっている `<<` 演算子。 **`+` 演算子:** 「str1 + str2」 という形式で使用される。 str1 と str2 を連結した新しい文字列を作成します。 この操作では、元の文字列は変更されず、新しい文字列オブジェクトが毎回生成されます。 **`<<` 演算子:** 「str1 << str2」 という形式で使用される。 str2 の内容を str1 に直接追加します。 この操作は str1 を破壊的に変更し、新しいオブジェクトの生成を伴わないため、メモリ効率が良く、処理速度も速いです。## << 演算子の利点 大量の文字列データを扱う際に特に有効で、大きなファイルの内容を読み込んで処理を行いたい場合、 `+` よりも `<<` 演算子を使う方がパフォーマンスが良いです。 理由として、`<<`演算子は元の文字列に
【Ruby】文字列をスペースで区切って配列にし、配列の要素を取り出す。
文字列をスペースで区切って配列にし、配列の要素を取り出すプログラムを作りました
Rubyで作りました。“`Ruby
str1 = “Hello paiza”
array1 = str1.split(‘ ‘)
length1 = array1.size()
for i in 0…length1 do
puts array1[i]
end
“`結果
![kekka.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710584/8859e6f4-1ecd-8d6c-ae10-a5b99cdecab9.jpeg)
SHA-1で作成したsigned_idをRails 7.0でもfind_signedで検索できるようにする
## はじめに:困ったこと・解決したいこと
Rails 7.0ではActive RecordのデフォルトのハッシュダイジェストアルゴリズムがSHA-1からSHA-256に変更されました。https://railsguides.jp/upgrading_ruby_on_rails.html#active-record-%E6%9A%97%E5%8F%B7%E5%8C%96%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E5%A4%89%E6%9B%B4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
この変更が入ると、Rails 6.1以前に生成したsigned_idはRails 7.0以降で利用できなくなります。
“`ruby
# Rails 6.1時代に user.signed_id で生成した署名付きid
signed_id = “eyJfcmFpbHMiOnsibWVzc2FnZSI6Ik1USXpORFU9IiwiZXhwIjpudWxsLCJwdXIiOiJ1c
【Ruby】each処理を簡潔に書く
見やすいコーディングを心がけながらコーディングをしてる矢先、
繰り返し処理の中身が簡潔なときにもっとスマートに書けないかなあ…と、
最近ふと思ったりしてたのでRubyのeach系の簡潔化をまとめてみました。単語と示してる場所がよく一致しなくなるのでひとまずメモ
“`ruby:qiita.rb
配列オブジェクト.メソッド {|初期値, 要素| ブロック処理 }
“`そして本題
“`ruby:qiita.rb
# 共通変数
arr = [1, 2, 3]
“`
## .map
用途:各要素に対して処理をする
返り値:配列
“`ruby:qiita.rb
# .eachで書いた場合
new_arr = [];
arr.each do |i|
new_arr << i * 10 end ``` ```ruby:qiita.rb # .mapで書いた場合 new_arr = arr.map{|i| i * 10} ``` ## .select 用途:blockの結果がtrueである要素を全て含む配列を返す 返り値:配列 ```ruby:qiita.rb # .eachで書い