object.valid? возвращает false, но object.errors.full_messages пусто - PullRequest
25 голосов
/ 21 декабря 2010

Я запутался в объектах, которые не могу сохранить, упрощенная модель -

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 

и в моем subscription_controller

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 не разрешает метод сохранения. К сожалению, я не могу знать, почему объект недействителен.

Если у вас есть идеи, спасибо.

Ответы [ 4 ]

48 голосов
/ 29 декабря 2010

У меня была такая же проблема. Сначала у меня был такой код в моей модели:

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

Я мог видеть свои ошибки.

Может быть, у вас есть что-то похожее в вашем коде?

12 голосов
/ 21 декабря 2010

Почему бы вам не попробовать @object.save!

Ruby должен сообщить вам, что пошло не так при попытке сохранить объект.

5 голосов
/ 22 декабря 2010

Попробуйте посмотреть на результаты:

subscription.errors.inspect
2 голосов
/ 27 января 2011

Хорошо, я наконец нашел проблему, спасибо товарищи за помощь.

Я переопределял действительные? метод в классе подписки для проверки другой функциональности, которая не имеет такой же семантики. Большая ошибка, я просто переименовал метод, и теперь он работает как шарм.

...