Rails - 在自定义验证期间"无法使用默认进程转储哈希"



我有 2 个模型。 UserWant .一User has_many: Want s。

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

我在Want模型中编写了一个自定义验证,以便用户无法提交以创建 2 个同名的想要:

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

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

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

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

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

如果我只是返回true无论错误显示在我的视图中,如我所愿。

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

谢谢。

如果没有堆栈跟踪(它会导致任何地方,还是只是没有出现?(,很难知道到底发生了什么,但以下是在干净环境中重现此错误的方法:

# 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 无法序列化进程,因此它无法正确重建序列化的哈希,因此会出现错误。

如果你合理地确定那条线是你的麻烦的根源,试着重构它,看看是否能解决问题。

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

相关内容

最新更新