yposiのブログ

Web開発日記

Docker + Rails6環境でコード即時反映されない件

Rails 6 + Dockerを用いて今サービス開発を行っている。 webpackerを使っていて、./bin/webpacker-dev-serverで起動していたらコードが即時ブラウザに反映すると思っていたが更新されない。 そういう人いるんじゃないかな?それまで毎回コンテナーを再起動してました。面倒になったので対応しました。

なんでそういう挙動をするかはわかっていないが対応方法はわかったので記載する。

ファイル: config/environments/development.rb

修正前:

  # Use an evented file watcher to asynchronously detect changes in source code,
  # routes, locales, etc. This feature depends on the listen gem.
  config.file_watcher = ActiveSupport::EventedFileUpdateChecker

修正後:

  # Use an evented file watcher to asynchronously detect changes in source code,
  # routes, locales, etc. This feature depends on the listen gem.
  config.file_watcher = ActiveSupport::FileUpdateChecker

ひとまずこれで少し開発が進めれる様になったとさ。

fudo3をバージョンアップ

ここ2週間くらいお仕事がバタバタしていてgemの開発が進まなかったけどカフェに行けたので今少し改善しました。

github.com

修正内容は、

  • 坪単価の計算を追加
  • 平米単価の計算を追加

これだけだけど不動産システムを作っていた時にこういうメソッドがいた気がするので追加しました。

他にv0.1.0で追加したメソッドのちょっとした修正をしました。
動作に影響ないところで。

fudo3は「不動産のサービス内でよく使われる計算をまとめたgem」にしたいので是非フィードバックください。

頑張って機能開発・改善していきたいと思います。
よろしくお願いします。

gemの名前をつける時は「-」はつけないほうがいい

fudo3を作ったときのメモになりますが、 当初、fudo3はfudo-3という名前でした。
ハイフンをつけたことでディレクトリが階層化されクラスが「Fudo::3」という気持ち悪いクラスになりました。

gemの開発コマンド

$ bundle gem fudo-3 -t

としたところ、
当然ファイルが自動生成されました。
ですが、ディレクトリが階層化されちゃいました。

f:id:yposi2:20200825211935p:plain

ちょっと調べたところ「-」をつけることでディレクトが階層化になるそうです。

階層化したいケースはあまりないと思うので
ちょっとしたことですが「-」はつけない方がいいと思います。

gemビギナーなのでこれがきれいじゃないとは言い切れませんが。。。

ひとまず、「fudo3」が無事にリリースできたので記事を書いてみました。

RubyGems

ソースコード

RubyMineの.idea/の対処法

RubyMineお使いですか?

www.jetbrains.com

プロジェクトで自分だけが使用しているケースってあると思うんですよね。
そういうときに.gitignoreに追加されておらずうっかり.idea/をstageして焦ったみたいな経験はございませんか?

私がやっているやり方を共有したいと思います。
自分の環境下の全プロジェクトで任意のファイルを 個人的に バージョン管理対象外にするやり方になります。

設定ファイルを作ります。

$ touch ~/.gitignore_global

.gitignore_globalを編集します。

# RubyMine
.idea/
.idea/**/workspace.xml
.idea/**/tasks.xml

設定を適応します。

$ git config --global core.excludesfile '~/.gitignore_global'

[core]部分に追加されます。

$ cat ~/.gitconfig
[user]
    name = 名前
    email = メールアドレス
[core]
    excludesfile = ~/.gitignore_global

保存すると、以後.idea/のファイルは差分として出てこなくなります。

今更感もありますが、 ちょっとしたチップスでした。

RailsとJSの定義でなんだっけ?となったもの

RailsとJSの定義でなんだっけ?となったものについて簡単に調べました。

$(function () {
  // 処理
}

$.fn.hoge = function () {
  // 処理
}

function fuga() {
  // 処理
}

これらが同一ファイル内に記述されていて、それぞれの定義の違いがよくわからなかったので手元のメモを公開します。 正確には②がわかっていなかっただけなんだけど😅

①はページが読み込み完了し、DOMの構築が完了した時点でfunction()内が実行されます。
①はこの様にも書くことができます。

$(document).ready(function() {
  // 処理
});
jQuery(function(){ 
  // 処理
}

つまり、これでも書けることになる。

jQuery(document).ready(function(){
  // 処理
});

②は標準のjQueryオブジェクト$.fnに対してインスタンスメソッドを拡張しています。
つまり、これでも書けることになる。

jQuery.fn.hoge = function () {
  // 処理
}

Rails環境内でこの書き方を定義する場合、jQueryの拡張にあたるのでどこからでも呼べる様になる。
同一ファイル内で呼ぶメソッドをこの定義にする必要はない気がしてきた。
むしろ、メソッド名を奇跡的にもかぶらせたら挙動が変わってしまう可能性もあるなと思いました。

③はメソッドの定義ですね。

古いRailsのバージョンで動く、jsファイルに拡張に拡張を重ねた感じなんだろうけど②である必要はないのかな😅

Effective JavaScript

Effective JavaScript

  • 作者:David Herman
  • 発売日: 2013/02/19
  • メディア: 大型本

gem開発素人ながらsyameiを公開した話

4年前に作りかけた「syamei」を2020/07/16に公開しました。

syameiは一言で、法人格を除くことができます。

用途は名寄せでした。

パーフェクトRuby on Railsでおなじみの前島さん(https://willnet.jp/)にペアプロでご指導いただいて途中まで作っていました。 

公開するところまでいかず放っていたのをふと自宅の大掃除のタイミングで思い出し、つい最近公開しました。

なんだかんだ470のダウンロードをいただいて0じゃなくてよかったと思っております。

少し気持ちがよくなったこともあって、情報を公開しないと使われずに眠る可能性があるのでブログを書き始めたところです。

当時は、法人格を除くだけの機能だったのですが、リリースに向けてメソッドを追加しました。

  • 末尾の法人格を削除
  • 先頭の法人格を削除
  • 使用している法人格を取得
  • gemに登録している法人格の取得

 当時よりレベルもあがっていたので「【Ruby】gemの作り方から公開まで - Qiita」を参考にさせていただき微修正したくらいです。

qiita.com

 

Circle CIの設定等はあまりやってきていないので「Rubyのgemを公開しつつCircleCIでCI/CD(継続的インティグレーション/継続的デリバリー)を体験しよう - Qiita」からコードを参考にして微修正したくらいなのでまだまだ改良ポイントがあると思っております。

qiita.com

 

他の法人格がissueにあがったら是非対応したいと思うのでよろしくお願いします。

 

それと全く関係がないところで、fudo3というgemをリリースしますのでそこで記事を書けたらと思います。

fudo3は不動産でよく使われている計算系をまとめたものになります。

 

参考にしたサイト

RubyGems

ソースコード

IpValidatorを追加した

これはRailsアプリケーションの話です。
今回カラムにipを追加し、バリデーションを追加して欲しいとのことでした。
バリデーションはIPv4IPv6に対応して欲しいということでした。

この記事は、

  • Resolv::IPv4::Regex とResolv::IPv6::Regex というものが用意されていた
  • validatorを用意することでModelがスッキリする

という話ができたらと思います。

Resolv::IPv4::Regex とResolv::IPv6::Regex というものが用意されていた

正規表現って自分で書くとバグを生んだり、面倒だったりするのでまずはネットで調べると思うのですが、ありがたいことにRubyはいろんなものが用意されています。
Resolv::IPv4::Regex の存在を見つけました。
コンソールで実行してみると、

irb(main):001:0> Resolv::IPv4::Regex
=> /\A((?x-mi:0
               |1(?:[0-9][0-9]?)?
               |2(?:[0-4][0-9]?|5[0-5]?|[6-9])?
               |[3-9][0-9]?))\.((?x-mi:0
               |1(?:[0-9][0-9]?)?
               |2(?:[0-4][0-9]?|5[0-5]?|[6-9])?
               |[3-9][0-9]?))\.((?x-mi:0
               |1(?:[0-9][0-9]?)?
               |2(?:[0-4][0-9]?|5[0-5]?|[6-9])?
               |[3-9][0-9]?))\.((?x-mi:0
               |1(?:[0-9][0-9]?)?
               |2(?:[0-4][0-9]?|5[0-5]?|[6-9])?
               |[3-9][0-9]?))\z/

これはすごいですね!
IPv6も動くんじゃないか?と淡い期待をして実行してみました。
やっぱりいました。

irb(main):002:0> Resolv::IPv6::Regex
=> /
      (?:(?x-mi:\A
      (?:[0-9A-Fa-f]{1,4}:){7}
         [0-9A-Fa-f]{1,4}
      \z)) |
      (?:(?x-mi:\A
      ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::
      ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?)
      \z)) |
      (?:(?x-mi:\A
      ((?:[0-9A-Fa-f]{1,4}:){6,6})
      (\d+)\.(\d+)\.(\d+)\.(\d+)
      \z)) |
      (?:(?x-mi:\A
      ((?:[0-9A-Fa-f]{1,4}(?::[0-9A-Fa-f]{1,4})*)?) ::
      ((?:[0-9A-Fa-f]{1,4}:)*)
      (\d+)\.(\d+)\.(\d+)\.(\d+)
      \z))/x

さすがです。
これをいい感じに使用したバリデーターを作ろうと思って作りました。

# frozen_string_literal: true

class IpValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    return true if Resolv::IPv4::Regex.match?(value) || Resolv::IPv6::Regex.match?(value)
    record.errors.add(attribute, :invalid_ip, options)
  end
end

作ったバリデーターを呼ぶには、

# == Schema Information
#
# Table name:hoges
#
#  id                 :bigint(8)        not null, primary key
#  ip                 :string(255)
#  created_at         :datetime         not null
#  updated_at         :datetime         not null
#

class Hoge < ApplicationRecord
  validates :ip, ip: true
end

「validates :ip, ip: true」これだけです。
バリデーターを作るところから真似してもらえると幸いです。

参考にしたページ