【发布时间】:2016-12-08 02:27:33
【问题描述】:
提交表单时遇到问题。
我有两个模型,:service 和 :booking。对于服务,有一个按钮:
<%= link_to "Book Now", new_booking_path(service_id: @service.id) %>
点击此按钮后,用户将转到_form.html.erb,在那里他们可以预订服务。这是简化的预订表格:
<%= simple_form_for (@booking) do |f| %>
<%= f.label "Booking Date" %><br>
<%= f.text_field :date %>
<%= f.text_field :time, :id => "timepicker" %>
<%= f.input :address, label: "Address" %>
<%= f.input :postcode, label: "Postcode" %>
<%= f.input :suburb, label: "Suburb" %>
<%= f.input :servicetitle, :input_html => { :value => @service.title } %>
<%= f.input :serviceprice, :input_html => { :value => @service.price } %>
<%= f.input :servicetime, :input_html => { :value => @service.time } %>
<%= f.button :submit %>
<% end %>
如您所见,我有三个字段,:servicetitle、:serviceprice 和 :servicetime。
这些字段从通过 link_to 按钮传递的 @service.id 值获取其输入值。我可以使用bookings_controller 中的这个实例变量来访问像@service.title 这样的记录:
@service = Service.find_by_id(params[:service_id])
我遇到的问题是,如果其中一个字段验证失败(比如:date 字段),那么用户会被重定向回_form.html.erb,我会收到错误
预订中的 NoMethodError#create
未定义方法title
我也会得到错误:
未定义的方法
price
和:
未定义的方法
time
我认为这是因为 Rails 无法再访问 @service 实例变量了?
验证失败时如何解决此问题?
编辑:
在预订控制器中创建方法:
def create
@booking = current_user.bookings.build(bookings_params)
if @booking.save
BookingMailer.form_confirmation(@booking).deliver
redirect_to @booking
else
render 'new'
end
end
【问题讨论】:
-
预订相关的服务如何实施?输入字段是什么?
-
@vee 一个服务属于一个预订,一个预订有很多服务。我的表单工作正常,除非它在错误时呈现表单,
@service实例变量似乎被破坏了 -
对,您的 create 方法没有定义
@service这就是您丢失值的原因。您可以发布您的控制器create操作吗? -
@vee 用 create 方法更新了我的问题
-
您是否让您的用户在预订期间创建服务?您是否更愿意使用可用服务的“选择选项”/下拉列表,以便您可以轻松地在
BookingsController#create中唯一地标识您的服务。这是 Rails 5 吗?
标签: ruby-on-rails validation simple-form