【发布时间】:2014-06-19 02:33:11
【问题描述】:
好的,有点困惑如何解决这个问题。
我有一个表格和两个模型。这是我的表格:
<% if @booking.errors.any? %>
<% @booking.errors.full_messages.each do |msg| %>
<p class="error"><%= msg %></p>
<% end %>
<% end %>
<% if @guest.errors.any? %>
<% @guest.errors.full_messages.each do |msg| %>
<p class="error"><%= msg %></p>
<% end %>
<% end %>
<%= form_for :booking, url: bookings_path do |f| %>
<%= label_tag :email, "Guest's Email Address" %>
<%= text_field_tag :email %>
<%= f.label :nights, "Nights" %>
<%= f.text_field :nights %>
<%= f.label :nights, "People" %>
<%= f.text_field :people %>
<%= f.label :nights, "Arrival Date" %>
<%= f.text_field :arrival %>
<% end %>
如您所见,电子邮件字段不是表单构建器的一部分。如果电子邮件不存在,则电子邮件地址将用于创建新的访客记录。一旦我有了客人的ID,就可以进行预订记录了。
这是在我的 BookingController 中创建操作的代码 - 表单被提交到...
...
def create
accommodation = current_user.accommodation
guest = Guest.find_or_create_by(:email => params[:email])
@booking = accommodation.bookings.new(post_params.merge(:guest_id => guest.id))
if @booking.save
flash[:success] = 'The booking has been added successfully.'
redirect_to :controller => 'bookings', :action => 'index'
else
render 'new'
end
end
...
我确实意识到这个问题并不新鲜,但我在任何地方都找不到解决问题的好方法 - 我希望能够正确设置表单(如有必要)并验证所有领域都使用这两个模型。然后我需要显示错误消息。目前,我的电子邮件在验证过程中被忽略,我不知道下一步该怎么做。
非常感谢任何帮助。
【问题讨论】:
-
在什么意义上它被忽略了?如果电子邮件不存在,您要么选择现有来宾,要么创建新来宾。您的意思是在显示表单错误时忽略?
-
抱歉,我不知道如何验证所有数据,因为验证规则是在两个不同的模型中定义的。那么如何在验证预订数据的同时验证电子邮件呢?
-
是的,我记得你的最后一个问题。有没有想过使用嵌套表单? railscasts.com/episodes/196-nested-model-form-part-1
-
我实际上看过那个视频。使用嵌套表单处理真的是个问题吗?我想我必须将 form_for 对象更改为 guest,然后添加 fields_for 进行预订 - 即便如此 - 我还没有看到使用两个模型的验证规则并显示错误(如果有)的示例。
-
只有在表单与 ActiveRecord 对象没有关联时才应该使用符号参数。在您的情况下,与大多数情况一样,您的表单已连接到 AR 对象,因此您应该使用
form_for @booking。不与 AR 对象关联的表单的一个示例是联系表单。
标签: ruby-on-rails ruby-on-rails-4