object.valid?返回false但object.errors.full_messages为空

alb*_*uer 25 ruby validation activerecord ruby-on-rails save

我混淆了我无法保存的对象,简化模型是

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 
Run Code Online (Sandbox Code Playgroud)

在我的subscription_controller中

if subscription.save
     # do something
else
     debugger # means breakpoint where i try subscription.errors.full_messages
     # do something else
end 
Run Code Online (Sandbox Code Playgroud)

我尝试使用ruby-debug为此添加一个断点,我在那里进行一些测试

subscription.valid? #=> false 
subscription.errors.full_messages #=> []
subscription.save! #=> ActiveRecord::RecordInvalid (Validation failed:)
Run Code Online (Sandbox Code Playgroud)

这说明ActiveRecord不允许使用save方法.不幸的是,我不知道为什么对象无效.

如果您有任何想法,谢谢.

lig*_*loy 48

我有同样的问题.起初我在我的模型中有这样的代码:

before_validation :set_some_param

def set_some_param
   self.some_param = some_value
end
Run Code Online (Sandbox Code Playgroud)

我改成之后:

before_validation :set_some_param

def set_some_param
   self.some_param = some_value
   true
end
Run Code Online (Sandbox Code Playgroud)

我可以看到我的错误.

也许你的代码中有类似的东西?

  • 具体来自[here](http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html):如果before_validation回调的返回值可以被评估为false,则进程将被中止,Base#save将返回假.如果ActiveRecord :: Validations#save!被调用它会引发一个ActiveRecord :: RecordInvalid异常.什么都不会附加到errors对象. (8认同)
  • 我也偶然发现了这一点.我对这个问题的一般解决方案是只使用`assign_attributes(some_param:some_value)`而不是直接赋值,因为这将在成功时返回一个真值. (2认同)
  • 5年多以后,这个答案仍然保存了开发者的理智......谢谢. (2认同)

Sam*_*amo 12

你为什么不试试 @object.save!

Ruby应该告诉你在尝试保存对象时出了什么问题.


cod*_*tim 5

尝试查看以下结果:

subscription.errors.inspect
Run Code Online (Sandbox Code Playgroud)

  • 嗨,谢谢你,你可以看到我们仍然看不到使对象无效的错误@ subscription.errors.inspect#=> <... @errors = {}>" (2认同)