Version
rails:7.0.8
ruby:3.1.4
Docker:25.0.2
目次
症状
railsのソースコードがDocker上だと即時反映されない。
具体例
class EmailValidator < ActiveModel::EachValidator
def validate_each (record,attribute,value)
#text length
max = 255
#属性、メッセージ、カウント
record.errors.add(attriibute, :too_long, count:max) if value.length > max
end
end
DockerComposeでrails cで作業するときエラーがあることにきづく。
irb(main):017> user.save
/app/lib/validator/email_validator.rb:6:in `validate_each': undefined local variable or method `attriibute' for #<EmailValidator:0x00007f19f1dd7dd8 @attributes=[:email], @options={:allow_blank=>true}> (NameError)
Did you mean? attribute
attributes
@attributes
attriibuteのスペルがおかしいので指定箇所を直す
class EmailValidator < ActiveModel::EachValidator
def validate_each (record,attribute,value)
#text length
max = 255
#属性、メッセージ、カウント
record.errors.add(attribute, :too_long, count:max) if value.length > max
end
end
同じ個所がおかしいとエラー
irb(main):020> user.save
/app/lib/validator/email_validator.rb:6:in `validate_each': undefined local variable or method `attriibute' for #<EmailValidator:0x00007f19f1dd7dd8 @attributes=[:email], @options={:allow_blank=>true}> (NameError)
Did you mean? attribute
attributes
@attributes
再度立ち上げると意図した挙動になる(バリデーションテスト)
irb(main):006> user.save
TRANSACTION (0.3ms) BEGIN
User Load (7.2ms) SELECT "users".* FROM "users" WHERE "users"."id" IS NOT NULL AND "users"."email" = $1 AND "users"."activated" = $2 LIMIT $3 [["email", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@example.com"], ["activated", true], ["LIMIT", 1]]
TRANSACTION (0.5ms) ROLLBACK
=> false
やったこと
コンテナ上のvolumeが編集しているディレクトリか確認する
まず、ローカルのソースがコンテナの状にマウントされていることを確認しました。
そしてローカルでのソースの変更が、DockerDesktop上のファイル確認では変更できていることを確認しました。
【attriibute】が【attribute】と変更になったのが反映されています。
ここで、コンテナのソースコードは変更されているが、Railsアプリがソースの変更を感知していないという可能性が高いと推察します。
(rails sで立ち上げたサーバーが変更を検知していない)
config/emvironments/developmentを確認
下記を追加し、RailsがRails -s でキャッシュを使用せず毎回ソースを見に行く設定
Rails.application.configure do
config.cache_classes = false
#追加 Docker環境での反映させる検証
#rails7では下記がなかったので追加
config.reload_classes_only_on_change = true
config.file_watcher = ActiveSupport::FileUpdateChecker
下記記事を中心に確認しました。
【Rails7 + Docker】ビューファイルの変更がlocalhostで反映されない不具合を解消する – Qiita
Docker化したRailsアプリを開発中、ビューファイル(.html.erb)のソースコードを変更して開発環境のlocalhostをリロードしても変更が反映されない不具合に遭遇しました。doc…
WSL・Windowsの再起動
ホストOSとコンテナの時刻に差異があると反映されないそうなので、powershellで再起動しました。
PCも再起動を行いました。
wsl --shatdown
コメント