【问题标题】:object.valid? returns false but object.errors.full_messages is empty对象。有效吗?返回 false 但 object.errors.full_messages 为空
【发布时间】:2011-05-28 19:18:48
【问题描述】:

我对无法保存的对象感到困惑,简化模型是

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 不允许使用 save 方法。不幸的是我不知道为什么这个对象是无效的。

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

【问题讨论】:

  • 你能重新添加你的验证器吗?也很高兴看到脚本/控制台会话显示您认为正在创建的有效订阅。
  • 什么时候打电话给subscription.errors.full_messages?在save/valid?之后?
  • 感谢您的回答,马克我添加了我的验证。 Marcel 我在保存错过后尝试显示错误(我在示例中的控制器中添加了调试器断点)

标签: ruby-on-rails ruby validation activerecord save


【解决方案1】:

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

Ruby 应该会告诉您在尝试保存对象时出了什么问题。

【讨论】:

  • 保存!生成以下异常 ActiveRecord::RecordInvalid Exception: Validation failed: 遗憾的是没有更多细节
  • 如果保存!抛出异常,也许您可​​以在代码中放置一个救援块并检查异常以获取完整的堆栈跟踪?或者我认为还有其他方法可以获得完整的堆栈跟踪,我似乎记得做过类似@object.save! --trace 之类的事情,但我记不清了……如果这种方法不起作用,je n'ai aucune idée mon ami : (
【解决方案2】:

尝试查看以下结果:

subscription.errors.inspect

【讨论】:

  • 您好,谢谢,正如您所见,我们仍然看不到使对象无效的错误@subscription.errors.inspect #=> <...>"
【解决方案3】:

我遇到了同样的问题。起初我的模型中有这样的代码:

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

我可以看到我的错误。

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

【讨论】:

  • 特别来自here:如果 before_validation 回调的返回值可以评估为 false,则该过程将中止并且 Base#save 将返回 false。如果 ActiveRecord::Validations#save!调用它会引发 ActiveRecord::RecordInvalid 异常。不会将任何内容附加到错误对象。
  • 哇,这个我快疯了...浪费了 2 个小时,但你的解决方案终于奏效了!
  • 我也偶然发现了这一点。我对这个问题的一般解决方案是只使用assign_attributes(some_param: some_value) 而不是直接分配属性,因为这将在成功时返回一个真实值。
  • 5 年多后,这个答案仍然在拯救开发者的理智......谢谢。
  • 是的,只浪费了 1.5 小时。我们应该把它们都加起来!
【解决方案4】:

好的,我终于找到问题了,感谢小伙伴们的帮助。

我覆盖了有效的? Subscription 类中的方法来测试具有不同语义的另一个功能。大错特错,我只是重命名了该方法,现在它就像一个魅力。

【讨论】:

    猜你喜欢
    • 2010-09-14
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    相关资源
    最近更新 更多