轨道验证存在没有失败为零

时间:2010-11-19 14:10:57

标签: ruby-on-rails ruby-on-rails-3 validation

我想确保存在一个属性,但它似乎仍然无法通过,我不确定检查它有多好。

这应该有用,但不行。它是一个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 %>

4 个答案:

答案 0 :(得分:2)

覆盖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被构造成一个包含单个哈希的数组?对于更合理的解决方案,您可能需要解释一下。

答案 1 :(得分:1)

在Chirantan的回答基础上,房间不是预订哈希的孩子吗?所以不应该是:

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

答案 2 :(得分:0)

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

要演示,请从控制台尝试:

a = []
a.empty?

这将返回true。

a = [{}]
a.empty?

返回false。

答案 3 :(得分:0)

尝试从数组中删除维度:

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

而不是

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