Kanioの日記

ジャンルが定まらず、混沌としています。

Ruby クラス確認、日時の変換 - IT開発備忘録

細かいの色々
クラス確認、日時の変換 ... 等

クラス確認
基本だけど良く忘れる、やばい。kind_of? と同じ。

obj.is_a?(mod)

ドキュメントによると is_a? は

オブジェクトが指定されたクラス mod かそのサブクラスのインスタンスであるとき真を返します。

instance_of?は

オブジェクトがクラス klass の直接のインスタンスである時真を返します。

なので地味に違う。学びがあるけど、使い分けが必要な時は来るのか。

Object#is_a? (Ruby 3.1 リファレンスマニュアル)

Object#instance_of? (Ruby 3.1 リファレンスマニュアル)

日時の変換
DateTimeとStringの変換が多い気がするが、これもよく忘れる。
と思ったら、DateTimeクラスは非推奨で、Timeクラスを使うべきとのこと。

# String -> Time
t = Time.new(yyyy,mm,dd,hh,mm,ss,TimeZone)
tt = Time.parse(mojiretsu)

# Time -> String
t.strftime(format)

Time.parse は失敗するとArgument Errorが発生するので、rescueすることが推奨されている。Time.parse (Ruby 3.1 リファレンスマニュアル)

strftimeのフォーマットは都度ドキュメントを見るのが早い。Time#strftime (Ruby 3.1 リファレンスマニュアル)



備忘録の一覧はこちら mokuzukanio.hatenablog.com

心が凪いだら仕方ない

心が凪いでいる。
アップもなく、ダウンもなく、ただただ平坦。

 

やる気をあげようにも何かのきっかけがないと気分が上がらない。

山があるから谷があるわけで、ボールは坂を転がるから、その勢いで登れたりもする。

 

平坦は平坦。山も谷もなく、ボールも自発的には転がらない。

何かしらのブーストが必要。

 

下り坂でもいいので、メンタルが動く何かが欲しい。

すると安易にもアルコールに走ってしまいそうだが、なにか別のもっと健康的な手段が欲しい。

 

答えもやる気も出ないまま、すでに20時。

時間を消費する感覚だけが恨めしい。

 

そうこう思い悩むうちに、評価SSの中盤スキル激盛りのデジタルが爆誕した。

タウラス杯はいただいた。

Rails Validation - IT開発備忘録

Documentを読むと大体解決する。
Active Record Validations — Ruby on Rails Guides

普通のValidation
基本覚えられないので、都度ドキュメントを見た方が早い。省略。

Custom Method
自分でvalidationの方法を書きたい場合。
validates を validate にして、自分で書いた validation の method を指定する。よくよく考えると、あんまり困ったことはない。

validate :hoge
def hoge
  if self.name == "mogemoge"
    errors.add(:base, "mogemoge はダメです")
  end
end


Custom Validation
自分でvalidationの方法を書きたい場合、その2。
ActiveModel::EachValidator を継承したクラスを用意して呼び出す。Custom Method と違ってどこでも使えるのが良い。
ファイルはapp/validatorsフォルダでも作って、そこに置いておく。たまにpathを通すのを忘れる。

# app/validators/hoge_validator.rb
class HogeValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    # 省略
  end
end


複合ユニーク制約
Documentから。気をつけるべくは、MySQLの場合は指定したカラムをnot nullにしとかないと予想外のデータが入ってしまうこと?

class Holiday < ApplicationRecord
 validates :name, uniqueness: { scope: :year, message: "should happen once per year" }
end


備忘録の一覧はこちら mokuzukanio.hatenablog.com

Rails Minitest - IT開発備忘録

なぜ人はspecを使うのか。

こういうのは本家のDefaultが正義でしょ、Minitestを使おうぜ。assertとstubとかmockを覚えれば大体いける。

Document
Testing Rails Applications — Ruby on Rails Guides


Assert
ドキュメントを見るのが良い。
よく忘れるのはこれ。Exceptionってどうやって拾うんだっけ、ってなる。

assert_raises( exception1, exception2, ... ) { block }


Log in
Warden::Test::Helpers を include したうえで、login_as を使う。

include Warden::Test::Helpers

test "should get new" do
  @user_01 = users(:user_01)
  login_as(@user_01, scope: :user)
  get new_moge_url
  assert_response :success
end


Stub
stub_any_instanceを使って、クラスのインスタンスメソッドを実行したことにする。オブジェクトのメソッドの場合はstubを使う。 stub_any_instanceは外部APIの呼び出し(を書いたクラスの処理)をスキップさせるためによく使う気がする。

test "should get new" do
  ClassName.stub_any_instance(:method_name, return_value) do
    assert_difference 'Hoge.count', 1 do
      patch moge_url(@moge), params: update_params
      assert_redirected_to moge_path
    end
  end
end

private

def return_valuse
  # 適当なvalue
end


Delayed Job
ActiveJob::TestHelplerを使って、perform_enqueued_jobs の間にテスト内容を書く。

test "should get new" do
  perform_enqueued_jobs do
    assert_difference 'Moge.count', 1 do
      patch moge_url(@moge), params: update_params
      assert_redirected_to moge_path
    end
  end
end


File Upload
ファイルアップロードのやり方。fixtureにファイルを置いて、それを読み込ませる。

setup do
  @file = fixture_file_upload('test/storage/file.png')
end

private

def params
  { hoge: { photo: @file } }
end


Task
バッチ処理のテスト。 バッチなので日時を stub することが多いような。Taskコマンドは reenable しないと連続で使えない。
Taskコマンドは非同期処理っぽいので、テスト項目を一括で実行するとちゃんと動かないことがあった(なんでかは調べてない)。

time_zone = Time.zone
time_zone.stub(:today, Date.new(2025, 1, 1)) do
  Rake::Task['hoges:moges'].reenable
  Rake::Task['hoges:moges'].invoke
  # テスト
end


class_nameとかmogeとかを混在して使ってるのに今更ながら気づいてしまった。


備忘録の一覧はこちら mokuzukanio.hatenablog.com

Rails エラーハンドリング - IT開発備忘録

偉い人がいるもんで、毎回これを読んで確認している。古い記事だが、これが答えなのでは?

Railsアプリの例外ハンドリングとエラーページの表示についてまとめてみた - Qiita

 

自分は

Controllerでのrescue_fromによる例外捕捉

をして、補足しきれないrouting errorは

Controllerオブジェクトを利用する場合

の方法をとっている。

 

その他気をつけているのは、エラー発生時のユーザーとのコミュニケーションの仕方。
ユーザー自身で回避できたり、詳細を知るべきエラーは、その内容を書いたメッセージを画面に返し、システムエラー等の知る必要のないものはゴメンねメッセージを画面に返して内部ではエラーログを出力し、Cloudwatch等に拾わせている。

 

備忘録の一覧はこちら

mokuzukanio.hatenablog.com

Rails Model のロギング - IT開発備忘録

Modelの基本的なログを楽に扱いたいので、callbackの処理をまとめたmoduleを作って、application_record.rb に読み込ませることにしている。より良い方法があると思う。誰か教えて。

Documentは地味にSPAだった。
Active Record Callbacks — Ruby on Rails Guides

# app/model/concern/moge.rb

module Moge
  extend ActiveSupport::Concern

  included do
    # create
    before_create :method_1
    after_create_commit :method_2
    # update
    before_update :method_3
    after_update_commit :method_4
    # creage & update
    after_validation :method_5
    # destroy
    before_destroy :method_6
    after_destroy_commit :method_7
  end

  def method_1
    # ログ処理
  end

  ~ 以下省略
end


備忘録の一覧はこちら mokuzukanio.hatenablog.com

Rails Scaffoldコマンド - IT開発備忘録

環境は Rails7

普通に使う

$ rails g scaffold ModelName

カラムのデータ型を指定したり、外部キーを指定したり

$ rails g scaffold ModelName hoge:integer moge:string model_name:belongs_to

モデル以外を作る

$ rails g scaffold_controller ModelName

Generateするファイルを設定する

# config/application.rb
config.generators do |g|
  g.stylesheets false
  g.javascripts false
  g.helper false
  g.template_engine = :slim
  g.jbuilder = false
end


備忘録の一覧はこちら mokuzukanio.hatenablog.com