Ruby on rails 对象。有效吗?返回false,但object.errors.full_消息为空

Ruby on rails 对象。有效吗?返回false,但object.errors.full_消息为空,ruby-on-rails,ruby,validation,activerecord,save,Ruby On Rails,Ruby,Validation,Activerecord,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, :mess

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

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 
为此,我尝试使用ruby debug添加了一个断点,在这里我可以进行一些测试

subscription.valid? #=> false 
subscription.errors.full_messages #=> []
subscription.save! #=> ActiveRecord::RecordInvalid (Validation failed:)
这说明ActiveRecord不允许save方法。不幸的是,我不知道为什么这个对象是无效的


如果你有任何想法,谢谢你

为什么不试试
@object.save


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

尝试查看以下结果:

subscription.errors.inspect

我也有同样的问题。起初,我的模型中有这样的代码:

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
我能看到我的错误


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

好的,我终于找到问题了,谢谢你的帮助


我正在重写有效的?方法测试具有不同语义的其他功能。大错特错了,我刚刚重新命名了这个方法,现在它就像一个符咒

你能把验证器加回去吗?如果看到脚本/控制台会话显示正在创建的您认为有效的订阅,也会很高兴。您何时调用
subscription.errors.full_消息
保存后
/
有效?
?感谢您的回答,Mark I添加我的验证。Marcel我尝试在保存未命中(我在示例中的控制器中添加了调试器断点)保存后显示错误!生成以下异常ActiveRecord::RecordInvalid exception:验证失败:遗憾的是,保存后没有更多详细信息!抛出一个异常,也许您可以在代码中放入一个rescue块,并检查该异常是否有完整的堆栈跟踪?或者我认为还有其他方法可以获得完整的堆栈跟踪,我似乎记得我做了类似
@object.save--跟踪
,但我记不清了。。。如果这类事情都不管用,那么je n'ai aucune idée mon ami:(您好,谢谢您,正如您所看到的,我们仍然看不到使对象无效的错误@subscription.errors.inspect#=>"特别是:如果before#U验证回调的返回值可以计算为false,则进程将中止,Base#save将返回false。如果调用ActiveRecord::Validations#save!,则将引发ActiveRecord::RecordInvalid异常。不会向错误对象追加任何内容。哇,我对这个…2 ho!感到疯狂你浪费了时间,但最终你的解决方案成功了!我也偶然发现了这一点。我对这个问题的一般解决方案是只使用
assign_属性(some_参数:some_值)
而不是直接分配属性,因为这将在成功时返回真实值。5年多后,这个答案仍然可以让开发人员保持理智……谢谢。是的,只浪费了1.5个小时。我们应该把它们全部加起来!
before_validation :set_some_param

def set_some_param
   self.some_param = some_value
   true
end