gpt4 book ai didi

ruby-on-rails - Rails - 'can' t 在自定义验证期间使用默认过程转储哈希

转载 作者:数据小太阳 更新时间:2023-10-29 08:32:35 26 4
gpt4 key购买 nike

我有 2 个模型。 用户想要。一个用户 有_many: 想要

Want 模型除了 user_id 之外还有一个属性,即 name

我在 Want 模型中编写了自定义验证,这样用户就无法提交以创建 2 个同名的 want:

validate :existing_want

private

def existing_want
return unless errors.blank?
errors.add(:existing_want, "you already want that") if user.already_wants? name
end

already_wants? 方法在用户模型中:

def already_wants? want_name
does_want_already = false
self.wants.each { |w| does_want_already = true if w.name == want_name }
does_want_already
end

验证规范通过了我的模型测试,但是当我尝试向 WantsController 中的 create 操作提交副本时,我的功能测试失败了:

def create
@want = current_user.wants.build(params[:want])
if @want.save
flash[:success] = "success!"
redirect_to user_account_path current_user.username
else
flash[:validation] = @want.errors
redirect_to user_account_path current_user.username
end
end

我得到的错误: 无法使用默认 proc 转储哈希

没有导致我的代码的堆栈跟踪。

我已将问题缩小到这一行:

self.wants.each { |w| does_want_already = true if w.name == want_name }

如果我只返回 true,而不管错误是否如我所愿显示在我的 View 中。

我不明白?怎么了?为什么它如此神秘?

谢谢。

最佳答案

没有堆栈跟踪(它会引导到任何地方,还是只是不出现?)很难知道到底发生了什么,但您可以通过以下方式在干净的环境中重现此错误:

# initialize a new hash using a block, so it has a default proc
h = Hash.new {|h,k| h[k] = k }

# attempt to serialize it:
Marshal.dump(h)
#=> TypeError: can't dump hash with default proc

Ruby 无法序列化 proc,因此它无法正确重构序列化的哈希,因此会出现错误。

如果您有理由确定那条线是问题的根源,请尝试重构它以查看是否可以解决问题。

def already_wants? want_name
wants.any? {|want| want_name == want.name }
end

def already_wants? want_name
wants.where(name: want_name).count > 0
end

关于ruby-on-rails - Rails - 'can' t 在自定义验证期间使用默认过程转储哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17331768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com