Object.valid? возвращает false, но object.errors.full_messages пуст
Я запутался в объектах, которые я не могу сохранить, упрощенная модель
class Subscription < ActiveRecord::base
belongs_to :user, :class_name => "User", :foreign_key => "user_id"
has_many :transactions, :class_name => "SubscriptionTransaction"
validates_presence_of :first_name, :message => "ne peut être vide"
validates_presence_of :last_name, :message => "ne peut être vide"
validates_presence_of :card_number, :message => "ne peut être vide"
validates_presence_of :card_verification, :message => "ne peut être vide"
validates_presence_of :card_type, :message => "ne peut être vide"
validates_presence_of :card_expires_on, :message => "ne peut être vide"
attr_accessor :card_number, :card_verification
validate_on_create :validate_card
def validate_card
unless credit_card.valid?
credit_card.errors.full_messages.each do |message|
errors.add_to_base message
end
end
end
def credit_card
@credit_card ||= ActiveMerchant::Billing::CreditCard.new(
:type => card_type,
:number => card_number,
:verification_value => card_verification,
:month => card_expires_on.month,
:year => card_expires_on.year,
:first_name => first_name,
:last_name => last_name
)
end
end
и в моем подписном_контроллере
if subscription.save
# do something
else
debugger # means breakpoint where i try subscription.errors.full_messages
# do something else
end
Я попытался использовать ruby-debug для этого, добавляя точку останова, где я делаю некоторые тесты
subscription.valid? #=> false
subscription.errors.full_messages #=> []
subscription.save! #=> ActiveRecord::RecordInvalid (Validation failed:)
который объясняет, что ActiveRecord не разрешает метод сохранения. К сожалению, я не знаю, почему объект недействителен.
Если у вас есть идеи, спасибо.
Ответы
Ответ 1
У меня была та же проблема. Сначала у меня был такой код в моей модели:
before_validation :set_some_param
def set_some_param
self.some_param = some_value
end
После того, как я изменил это на:
before_validation :set_some_param
def set_some_param
self.some_param = some_value
true
end
Я мог видеть свои ошибки.
Возможно, у вас есть что-то симулятивное в вашем коде?
Ответ 2
Почему бы вам не попробовать @object.save!
Ruby должен сообщить вам, что пошло не так во время попытки сохранить объект.
Ответ 3
Попробуйте просмотреть результаты:
subscription.errors.inspect
Ответ 4
Хорошо, наконец, я нашел проблему, спасибо помощникам за помощь.
Я переопределял действительность? метод в классе Subscription для проверки другой функциональности, которая не имеет той же семантики. Большая ошибка, я просто переименовал метод, и теперь он работает как шарм.