rails7 Docker ソースの変更が反映されない

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

下記記事を中心に確認しました。

WSL・Windowsの再起動

ホストOSとコンテナの時刻に差異があると反映されないそうなので、powershellで再起動しました。

PCも再起動を行いました。

wsl --shatdown
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次