- 1. フリーランス歴20年の強強エンジニアからのガチコードレビュー集
- 2. RubyでAtCoder ABC233(A, B, C)を解いてみた
- 3. Ruby ブロックを使う配列のメソッド
- 4. 【Rails7】rails/request.jsでAjax制御する
- 5. 開発ツールに頼らず 様々な言語から WebAssembly(第5回)
- 6. Railsで入力フォーム等にバリデーションを設定する
- 7. rails7.2から`TestFixtures#fixture_path`が廃止されるためrails 7.1では`DEPRECATION WARNING: TestFixtures#fixture_path is deprecated`が発生する
- 8. [Rails] MySQL関数 TIMESTAMPADD で動的に日付計算して絞り込む
- 9. RailsのDelegateを理解する
- 10. 固定長の配列を初期化する
- 11. 配列を特定数ずつに区切る
- 12. 【個人開発】お惣菜の商談記録管理アプリ【Rails】
- 13. 開発ツールに頼らず 様々な言語から WebAssembly(第4回)
- 14. Ruby Gold 3.1のテストに2回落ちました
- 15. 【Rails API】「v1」とは何を表しているの?
- 16. この一ヶ月で学んだこと ruby周辺ver
- 17. 0から1ヶ月でサーバーサイドエンジニアになるための手順書
- 18. 【Rails】フロントから指定したidが返ってこなかった場合、バックエンドで新しいidを作成してレコードを作成する
- 19. FactoryBot 6.0で、enumからtraitが作成されるようになったお話
- 20. Rails 別のユーザーの投稿を消せてしまった件
フリーランス歴20年の強強エンジニアからのガチコードレビュー集
# はじめに
こんにちは、[まつけん](https://twitter.com/matsuken_web314)です。
早いもので、Webエンジニアになって、**10ヶ月**経とうとしています。
先月末、僕の職場に参画していたフリーランス歴20年の強強エンジニアCさんが卒業されました。(以降**Cさん**と称します)Cさんには、いつも迅速かつ丁寧なレビューをしていただいてました。
たまに補助で僕のプルリクにコミットを積んでもらうことなどもあり、お世話になった記憶が大半です。今回はそんなCさんから受けたコードレビューから、今後どう改善していくのかアウトプットして学びを深めたいため、こちらの記事を書きました。
ペアプロしている時の参考になったこともおまけで書いてます。
:::note info
**この記事が参考になりそうな読者**
– Rubyの「アンチパターン」から良いコードを学びたい人
– エンジニア1年目がどんなコードレビューを受けているのか知りたい人
:::※こちらの記事に出てくるコードに関しては全て`Ruby`です。実務で学んだことなので、出てくるコードは
RubyでAtCoder ABC233(A, B, C)を解いてみた
# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC233のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。# A – 10yen Stamp
https://atcoder.jp/contests/abc233/tasks/abc233_a
“`ruby:a-233.rb
x, y = gets.split.map(&:to_i)
y -= x
if y < 0 puts 0 exit end ans = y / 10 puts y % 10 == 0 ? ans : ans + 1 ``` # B - A Reverse https://atcoder.jp/contests/abc233/tasks/abc233_b ```ruby:b-233.rb l, r = gets.split.map(&:to_i) l -= 1 r -= 1 s = gets.chomp s[l..r] = s[l..r].chars.reverse.join puts s ``` #
Ruby ブロックを使う配列のメソッド
# はじめに
– Rubyの配列やブロックの復習用
– 学習したことの備忘録
– 今回は1問1問式# 学習した内容
– 配列(Arrayクラス)
– ブロック# 参考にした教材
– [プロを目指す人のためのRuby入門]( https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA
【Rails7】rails/request.jsでAjax制御する
表題通りです。RailsでAjax制御するには今まではjqueryを使ったりしてきました。Rails6になってからrails-ujsというライブラリが推奨され、それによってイベント発火して対応したのですが、このrails-ujsはRails7で非推奨となってしまいました。
代わりに実装された同期制御用のスクリプトturboですが、これはどうも不具合が多く、評判が今ひとつ芳しくない上にRansackとの相性もあまり良くありません。何よりテンプレートやコントローラーで色々書き換えが必要になるのが面倒です。そこで代わりの非同期通信手段を調べていたところ、**rails/request.js**というものも提供されたみたいで、これを使ってAjax制御できるみたいです。
Githubの公式マニュアル
– [rails/request.js](https://github.com/rails/request.js)
Qiita内に触れている記事
– [【Rails7】Ajaxリクエスト時にCSRF tokenを含める(おそらく)公式のやり方](https://qiita.com/gnattal
開発ツールに頼らず 様々な言語から WebAssembly(第5回)
WebAssembly は多くのプログラム言語からライブラリの様に呼び出す事が出来る。
WebAssembly のコードを書く方法は多くの記事で書かれているが、その使い方はフレームワーク等のツールに頼っている事が多い様だ。
本記事では、そのような便利ツールに出来るだけ頼らず JavaScript, Rust, Python, Ruby から WebAssembly を実行する方法を記載する。WebAssembly は新しい技術である。
目先の最先端ツールに飛びつくのもよいが、その基礎を学んで長く使える知識を身に着けないか?本記事はシリーズの第3回である。シリーズ記事の一覧は [第1回] の **#シリーズ記事一覧** に載せている。シリーズの記事を追加する時は [第1回] の一覧を更新して通知を行うので興味の有る人は [第1回] をストックして欲しい。
# 本記事の概要と過去記事の復習
[第3回] と [第4回] は WebAssembly のコードに状態を持たせる方法について記載した。
今回は WebAssembly に「クラス変数」の様な物を追加するコードを紹介する。
Railsで入力フォーム等にバリデーションを設定する
# そもそもバリデーションとは
入力フォームなどでユーザーが故意または過失のもと誤った情報を入力した際に、入力内容をそのまま登録するのではなく、エラーをかえすこと。
これにより、誤情報を未然に防ぐほか、攻撃者からのXSSなども防ぐことが可能になる。# 実装例
RailsのModelに記述します。– 空データを登録できないようにする
“`ruby:member.rb
class Member < ApplicationRecord validates :name, presence: true end ``` - 文字数を制限する。 ```ruby:member.rb class Member < ApplicationRecord #長さの上限を50文字に設定 validates :name, length: { maximum: 50 } #長さの下限を2文字に設定 validates :name, length: { minimum: 2 } #長さの範囲を2-50文字 validates :name, lengt
rails7.2から`TestFixtures#fixture_path`が廃止されるためrails 7.1では`DEPRECATION WARNING: TestFixtures#fixture_path is deprecated`が発生する
# 発生する理由
`rspec_helper.rb`の中で以下のように`fixture_path`を指定してテストケースで参照している場合に`DEPRECATION WARNING`が発生します。
“`ruby:rspec_helper.rb
config.fixture_path = Rails.root.join(‘spec/fixtures’)
“`“`ruby:spec/sample_spec.rb
Rack::Test::UploadedFile.new(“#{fixture_path}/test.txt”)
“`### DEPRECATION WARNING
“`
DEPRECATION WARNING: TestFixtures#fixture_path is deprecated and will be removed in Rails 7.2. Use #fixture_paths instead. If multiple fixture paths have been configured with #fixture_paths, then
[Rails] MySQL関数 TIMESTAMPADD で動的に日付計算して絞り込む
# 背景
– 複数の「住宅/Article」がある
– 住宅にはそれぞれその建物が「完成した日/completion_date」が登録されている
– 住宅には加入している定期点検のサービスがそれぞれあり、
– 加入しているサービスごとに点検時期(InspectionMonth.month)が複数設定されている
– 例えば、
– 住宅Aでは「1カ月点検」「3カ月点検」「1年点検」
– 住宅Bでは「5年点検」「10年点検」「50年点検」
– などなど## 目的
– 「特定の日(通常は当日)」に点検時期を迎える住宅をSQL一発で絞り込みたい
## 環境
“`
Ruby 2.7.2 / 2.7.8
Rails 6.0.3 / 6.1.7
MySQL 5.7
“`## 簡略化モデル
※実際にはもっといくつかのテーブルが関連しており、ArticleとInspectionMonthは直接繋がってはいないですが、その辺は省略しています。
“`ruby
# 住宅(戸建て・マンションの一室・テナント などなど)
#
# == Schema In
RailsのDelegateを理解する
# はじめに
Ruby on Railsを使ったプロジェクトに配属され、Railsを学び始めた新卒エンジニアです。コードを読む中で、見慣れないDelegateメソッドを見つけたので調べてみました。
本記事の対象者はRubyやRailsの初心者、オプジェクト指向プログラミング初心者向けの記事となっています。修正点や改善点などがあればコメントまでお願いします。# Delegateとは
あるオブジェクト(一般的にはモデルオブジェクト)から別のオブジェクトへのメソッド呼び出しを委譲するために使用されます。[定義に関してはこちら](https://github.com/rails/rails/blob/7-0-stable/activesupport/lib/active_support/core_ext/module/delegation.rb)“`ruby: delegateの定義
delegate :カラム名, to: :委譲先のオブジェクト名
“`
また、委譲できるメソッドは複数追加することが可能です。“`ruby: 複数のメソッドの委譲
class Order <
固定長の配列を初期化する
# 概要
固定長の配列を初期化する
# 方法
`Array.new`を使う
## sample
“`ruby
Array.new(5)
=> [nil, nil, nil, nil, nil]
“`初期値の設定
“`ruby
# 第二引数に設定
Array.new(5, 0)
=> [0, 0, 0, 0, 0]# block でも可
Array.new(3){ “foo” }
=> [“foo”, “foo”, “foo”]
“`2重配列
“`ruby
# blockを応用して2重配列
Array.new(3){ Array.new(2) }
=> [[nil, nil], [nil, nil], [nil, nil]]
“`# 最後に
rubyだとあまり使わないだろうけれど、、、
`new`での初期化を覚えておくといざというときに便利かもしれない# 追記
初期化した際のオブジェクト周りについて興味深いコメント頂いたので追加で調べて追記
引数で初期化する場合、オブジェクトが共通になっている
“`ruby
arr = Arr
配列を特定数ずつに区切る
# 概要
配列を特定の数ずつに分割したい
環境:Ruby 3.2
# 方法
each_sliceってのがあった。
## sample
“`ruby
# 中身を確認
(1..10).each_slice(3) {|a| p a}
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
[10]# 配列にして分割されているか確認
(1..10).each_slice(3).to_a
=> [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]# 返却はEnumerator
(1..10).each_slice(3).class
=> Enumerator“`
【個人開発】お惣菜の商談記録管理アプリ【Rails】
# はじめに
未経験でディープロ(旧:DIVE INTO CODE)に入校し、4ヶ月の受講の集大成としてオリジナルアプリケーションを作成しました。
名前は「デリレコ」と言います。
前職(お惣菜の商品開発)の経験を元にした、お惣菜の商談記録が管理できるアプリケーションです。
アプリケーション:https://protected-coast-48892.herokuapp.com
GitHub:https://github.com/MayuKishimoto/deli_reco.git# なぜ「デリレコ」を作ったのか
### 結論:商品の商談記録を管理するのが大変だったから!
前職の時にはこんな悩みがありました。
**1. 商品数が多い問題**
一事業所で、月に1
開発ツールに頼らず 様々な言語から WebAssembly(第4回)
WebAssembly は多くのプログラム言語からライブラリの様に呼び出す事が出来る。
WebAssembly のコードを書く方法は多くの記事で書かれているが、その使い方はフレームワーク等のツールに頼っている事が多い様だ。
本記事では、そのような便利ツールに出来るだけ頼らず JavaScript, Rust, Python, Ruby から WebAssembly を実行する方法を記載する。WebAssembly は新しい技術である。
目先の最先端ツールに飛びつくのもよいが、その基礎を学んで長く使える知識を身に着けないか?本記事はシリーズの第3回である。シリーズ記事の一覧は [第1回] の **#シリーズ記事一覧** に載せている。シリーズの記事を追加する時は [第1回] の一覧を更新して通知を行うので興味の有る人は [第1回] をストックして欲しい。
# 本記事の概要と過去記事の復習
[第3回] では作成する WebAssembly のコードに整数型の状態(インスタンス変数、プロパティ)を持たせた。
本記事では整数に加えて String 相当のプロパティを持たせる。
Ruby Gold 3.1のテストに2回落ちました
Ruby Gold 3.1の資格を受験して、2回落ちて3回目で合格できました。
rubyのバージョンが3に上がってからの、受験記録の記事はあまり数が多くないと感じたため、受験した中で、回答に迷った問題をまとめます。
点数の履歴は、70点、68点、80点でした。なお、バージョン3の参考記事としては、下記が非常に参考になりました。
https://qiita.com/heysan/items/82bdfb7af4325f05e0e5# 1問目
“`ruby
a = _(1)_ # ここを問う問題
Ruby Gold
version 3
EOS
puts a(実行結果)
Ruby Gold
version 3
“`
選択肢として、以下のようなものがでました。
1. <<~EOS 1. <
【Rails API】「v1」とは何を表しているの?
Rails APIについて学習しています。
URL:`http://localhost:3000/api/v1/articles`や、
RL:`http://localhost:3000/api/v1/articles/[:id]`に、
アクセスした時のレスポンスとしてJSONを返すようなプログラムを実装しています。その際、URLに指定する「v1」というワードが気になったので、調べてみました。
# 使用環境
– Ruby 2.6.6
– Rails 6.0.2.1
– jsonのserializer は fast_jsonapi を使用。# テーブル
以下、モデル・テーブルを事前に準備していることを前提にしています。– Userテーブル
– Profileテーブル
– Articleテーブル
– Commentテーブル# 【本題】v1とは何を表しているの?
– それは一般的にAPIのバージョンを表している。
– APIの設計においては、後方互換性を壊さないように新しいバージョンを作ることがある。
– そのときに、v1やv2といった形でバージョンをURLに含めるこ
この一ヶ月で学んだこと ruby周辺ver
# この一ヶ月で学んだこと
いや、この6月の一ヶ月は忙しくて、なかなか記事を更新できていませんでした。
ただ、この一ヶ月はかなり学ぶことがったので、忘れないようにまとめておきたいと思います。
Vueも入れると膨大になるので今回はrubyやその周辺に絞って書きます。# ruby method
まずは、今回使用したrubyメソッドをまとめておこう。
今回のプロジェクトでは、ファイルをreadして、それを配列の中にオブジェクトで格納する方法でデータを取り扱った。その際に、以下のメソッドを使用して、ゴニョゴニョしたわけだ。## strip
説明: 文字列の両端から空白文字を削除
“`
str = ” Hello, World! ”
stripped_str = str.strip
puts stripped_str
# 出力: “Hello, World!”
“`## split
説明: 文字列を指定した区切り文字で分割し、配列として返す“`
str = “apple,banana,cherry”
fruits = str.split(“,”)
puts fruits
0から1ヶ月でサーバーサイドエンジニアになるための手順書
サーバーエンジニアになりたいという方のために
以下を元に要点の要点だけを抽出して、全体像がわかるような情報をまとめました。# サーバーサイドエンジニアとは
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700428/091b9f41-92f2-39d8-f6bd-0f6ee1fe7e19.png)
ユーザーには見えない後ろ側の処理、サーバーの処理を実装するエンジニアです。
# 言語選定
・Rust
・Go
・Java
・TypeScript
・C#
・Python
・PHP
・Ruby
あたりです。僕らはPython使ってます。
# フレームワーク選定
サーバーサイド開発にもフレームワークが存在します。有名所は以下です。
Rust: Rocketとか、Actix-Web
Go: Ginとか、Echo
Java: Spring Bootとか、Play Framework
TypeScript: NestJSとか、Express.js
C#: .
【Rails】フロントから指定したidが返ってこなかった場合、バックエンドで新しいidを作成してレコードを作成する
*見習いエンジニア向けです
こちらの記事の方が簡潔で短く書けます。
https://qiita.com/ytnd0928/items/b16b1fc5bc8c01252d2f
# やること
Ruby on Railsを用いてバックエンドを実装している際に、フロントがid=1を指定します。
その際にid=1のものが存在しなかった場合に、バックエンド側でidを作成し、レコードを返すという実装をしたいと思いました。### 手順1
フロントエンドからID=1が返ってこなかった場合に、Railsで新しいIDを作成してレコードを作成するか、既存のレコードを更新する。
– 今回はItemsControllerというコントローラーを作成
– PUTに処理を書く
– idが1のitemを探す
– id = 1のitemが見つからない場合(nilの場合).newで新しく作成する
– .saveで保存する“`ruby:ItemsController.rb
class ItemsController < ApplicationController # PATCH/PUT
FactoryBot 6.0で、enumからtraitが作成されるようになったお話
Railsで、gemをアップデートしていた時によくわからない記述を発見したので、検証備忘録です。
https://github.com/thoughtbot/factory_bot/blob/main/NEWS.md#600-june-18-2020
こちらに、
>Added: automatic definition of traits for Active Record enum attributes, enabled by defaultとあります。
これがよくわからなかったので、手元で検証しました。# 動作例
仮に以下のようなクラスがあり、
“`ruby
class User < ApplicationRecord enum role: { normal: 0, vip: 1, admin: 2 } enum rank: { white: 0, silver: 1, gold: 2 } end ``` 以下のように適当なfactory_botが定義されていたとすると ```ruby FactoryBot.define do factory :user
Rails 別のユーザーの投稿を消せてしまった件
# はじめに
– 製作したSNSサイトで、urlの直打ちをすると、他人の投稿編集画面に潜入できてしまった
– その対策をとった、学習したことの備忘録# 修正前
“`ruby:posts_controller.rb
before_action :authenticate_user!
before_action :set_post, only: [:show, :edit, :update]# 省略
def edit
enddef update
if @post.update(post_params)
flash[:dark] = “あなたの投稿を更新しました!!”
redirect_to post_path(@post.id)
else
flash[:danger] = “更新に失敗しました。”
redirect_to edit_post_path(@post.id)
end
enddef destroy
@post.destroy
flash[:dark] = “あなたの投稿を削