Ada*_*ite 2 ruby validation activerecord ruby-on-rails ruby-on-rails-3.2
我有2个型号.User和Want.一个User has_many: Want.
该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
Run Code Online (Sandbox Code Playgroud)
该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
Run Code Online (Sandbox Code Playgroud)
验证规范在我的模型测试中通过,但是当我尝试向以下create操作提交副本时,我的功能测试失败WantsController:
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
Run Code Online (Sandbox Code Playgroud)
我得到的错误: 无法使用默认proc转储哈希
没有堆栈跟踪导致我的代码.
我已将问题缩小到这条线:
self.wants.each { |w| does_want_already = true if w.name == want_name }
Run Code Online (Sandbox Code Playgroud)
如果我只是返回,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
Run Code Online (Sandbox Code Playgroud)
Ruby无法序列化procs,因此无法正确重构该序列化哈希值,从而导致错误.
如果您有理由确定该行是您遇到问题的根源,请尝试重构它以查看是否能解决问题.
def already_wants? want_name
wants.any? {|want| want_name == want.name }
end
Run Code Online (Sandbox Code Playgroud)
要么
def already_wants? want_name
wants.where(name: want_name).count > 0
end
Run Code Online (Sandbox Code Playgroud)