YOSHINO日記

プログラミングに関すること

DHH

正規表現とcaseを利用して分類する+α.............

DHH

美しいとおもった 実例 読みやすいしキレイ。 def type @type ||= case content_type when /^text/ then 'text' when /^image/ then 'image' when /^audio/ then 'audio' when /^video/ then 'video' when /pdf/ then 'pdf' else 'file' end.inquiry end inq…

cattr_accessor(mattr_accessor)を使うべき時って?

DHH

3通りのアクセサについて Rails: クラスレベルの3つのアクセサを比較する(翻訳) attr_accessor: 値を継承したくない場合に使う cattr_accessor(mattr_accessorのエイリアス): 値をすべてのクラスで共有したい場合に使う class_attribute: 継承した値を親ク…

Rails: # FIXMEとチーム開発に関して

DHH

お手本 ActiveStorageでのDHHの例をみてみる。 1つはAmazon S3サービスのアップロードの例。 def upload(key, io, checksum: nil) # FIXME: Ensure integrity by sending the checksum for service side with verificarion object_for(key).put(body: io) e…

Rails: 小さいクラスから大きいクラスを作る方法

DHH

委譲か継承。それが問題だ。そうなんだ。 Railsの委譲と継承について考えます。 具体的にいえば、委譲として”delegate_missing_to”、”SimpleDelegator”。 継承としてSTIを見てみます。 委譲か継承。それが問題だ。 継承の本質は、重複を避けて DRY にする事…

Ruby: 配列に重複をしないで要素を追加する

DHH

+: 重複が起こる Avoid duplicate attachments · rails/activestorage@7d3955e · GitHub a = [1, 2, 3] b = [4, 5, 6] arr1 + arr1 + arr2 #=> [1, 2, 3, 1, 2, 3, 4, 5, 6] | : 和集合を使うことで重複を避ける a = [1, 2, 3] b = [4, 5, 6] arr1 | arr1 |…

Rails:モデルに動的にメソッドを追加する

DHH

ActiveStorageのhas_fileの実装を見てみる。 Add attachments · rails/activestorage@aaf8415 · GitHub ActiveStorageのhas_fileを例に考えてみます。 class User < ActiveRecord::Base has_file :avatar end 上記のようにUserモデルにhas_file :avatarを記…

Railsのstale?: キャッシュを利用してサーバー負荷を減らす

DHH

Etag? Browser Cache: How ETags works in Rails 3 and Rails 4 - mohanraj nagasamy Ruby on Rails のConditionalGet について サーバは応答するときにコンテンツの Last-Modified とETag を付与します。ブラウザはその値を覚えておきます。 同じコンテンツ…

Railsでデザインパターン「Lazy Factory」

DHH

Lazy Factory?? 遅延読み込み - Wikipedia デザインパターンの観点では遅延初期化はFactory Method パターンと共に用いられる。これは3つのアイデアを組み合わせである。 クラスインスタンスを得るためにファクトリメソッドを利用する(Factory Method パタ…

ActiveStorageでみた不自然な条件分岐に関して

DHH

解せぬ。 ActiveStorageのコミットログを最初から見て勉強しております。 def self.decode(encoded_key) key, expires_at = verifier.verified(encoded_key) if key # ここ!! key if expires_at.nil? || Time.now.utc < expires_at end end keyがnilを来る…

何かをした後にインスタンスを生成したい時は、tap×tapする

DHH

ActiveStorageの例 以下の例は、ActiveStorageのコードの一部である。 class << self def build_after_upload(data:, filename:, content_type: nil, metadata: nil) new.tap do |blob| blob.filename = filename blob.content_type = content_type blob.upl…