class User < ApplicationRecord
validates :validate_method
def self.testmethod(url)
User.find_by("url like ?", "%#{URI.parse(url).host}%").present?
end
private
def validate_method
略
end
end
定義したはずのtestmethodが呼び出せない。
irb(main):002:0> User.testmethod('http://test.com')
Traceback (most recent call last):
2: from (irb):2
1: from (irb):2:in `rescue in irb_binding'
NoMethodError (undefined method `testmethod' for User (call 'User.connection' to establish a connection):Class)
試しにメソッドを単純化してみたところ、エラーが変わり、原因が特定できた。
def self.testmethod
true
end
irb(main):001:0> User.testmethod
Traceback (most recent call last):
3: from (irb):1
2: from app/models/user.rb:1:in `<top (required)>'
1: from app/models/user.rb:4:in `<class:User>'
ArgumentError (You need to supply at least one validation)
一つだけバリデーションメソッドを入れているところが、validateではなくvalidatesになっていることによる不具合だった。
下記の修正でself.testmethod(url)も呼び出せた。
誤
validates :validate_method
正
validate :validate_method
Railsは単数/複数の調整をいい感じにやってくれる分、設定ミスを起こすとエラーになりがちですね。