铁轨验证的存在没有失败的零

问题描述:

我想确保一个attibute存在,但它似乎仍然通过,我不知道如何更好地检查它。铁轨验证的存在没有失败的零

这应该工作,但没有。它是一个attr_accessor,如果它有所作为,它不是真正的属性。

validates_presence_of :confirmed, :rooms 

{"commit"=>"Make Booking", 
"place_id"=>"the-kosmonaut", 
"authenticity_token"=>"Tkd9bfGqYFfYUv0n/Kqp6psXHjLU7CmX+D4UnCWMiMk=", 
"utf8"=>"✓", 
"booking"=>{"place_id"=>"6933", 
"bookdate"=>"2010-11-22", 
"rooms"=>[{}], 
"no_days"=>"2"}} 

不知道为什么我的form_for以数组形式返回一个空哈希...

<% form_for :booking, :url => place_bookings_path(@place) do |f| %> 
<%= f.hidden_field :bookdate, { :value => user_cart.getDate } %> 
<%= f.hidden_field :no_days, { :value => user_cart.getDays } %> 

<% for room in pricing_table(@place.rooms,@valid_dates) %> 

    <%= select_tag("booking[rooms][][#{room.id}]", available_beds(room)) %> 

<% end %> 
<% end %> 

validates_presence_of检查字段是否为空。如果房间数组为空(设置为[]),验证将失败,但由于数组包含散列,因此验证不会失败。

为了证明,从控制台试试这个:

a = [] 
a.empty? 

这将返回true。

a = [{}] 
a.empty? 

返回false。

+0

我有点想通了,但我该如何做一个验证来检查数组中的空白散列? – holden 2010-11-19 14:31:41

+0

您可以使用多种技术为您的领域创建自定义验证器 - 有关详细信息,请参阅“验证”API文档。 – rbaldwin 2010-11-19 14:39:20

重写validate方法并在那里写入您的自定义验证检查。像

def validate 
    if rooms.blank? || rooms.first.blank? # first because it seems to be an array that holds only one Hash. 
    errors.add_to_base "Rooms can't be blank." 
    end 
end 

顺便说一句什么,为什么rooms结构是保存单个哈希数组?为了更明智的解决方案,您可能需要解释这一点。

+0

我不确定它为什么会返回一个空白的散列...我将用表单详细信息更新我的问题,也许你可以告诉我。 – holden 2010-11-19 16:58:36

+0

实际上由于某种原因不起作用,虽然它是复数,rooms.blank? || rooms.first.blank? – holden 2010-11-19 17:15:38

+0

您可能想解释为什么数组中的散列。关键是要编写你自己的验证方法,并让你自己的逻辑决定是否应该验证错误。 – Chirantan 2010-11-22 07:17:43

尝试从阵列移除维度:的

<%= select_tag("booking[rooms][#{room.id}]", available_beds(room)) %> 

代替

<%= select_tag("booking[rooms][][#{room.id}]", available_beds(room)) %> 
+0

需要额外维度将它们全部推入一个大阵列中,因为我要存储room_id,然后存储房间中的值或数量。这是我能够完成这项工作的唯一方法。 – holden 2010-11-19 17:17:42

+0

http://*.com/questions/4205974/rails-attr-accessor-complex-select-array – holden 2010-11-19 17:19:13

大厦Chirantan的回答,是不是房间预订哈希的孩子?所以不应该是这样的:

def validate 
    if booking[:rooms].blank? || booking[:rooms].first.blank? 
    errors.add_to_base "Rooms can't be blank." 
    end 
end