提交表单时遇到问题。
我有两个模型,: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
值获取其输入值。我可以使用@service.title
:
bookings_controller
之类的记录
@service = Service.find_by_id(params[:service_id])
我遇到的问题是如果其中一个字段验证失败(比如:date
字段),那么用户会被重定向回_form.html.erb
并收到错误
Bookings中的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
答案 0 :(得分:1)
我很确定这是因为在你的create方法中你还没有为@service变量赋值,在你的新方法中你实例化了@service变量(至少我假设你是和你一样)当你进入“动作”时没有出现错误,但是你没有在创建动作中这样做。
当您转到创建操作时,整个请求周期从头开始,这意味着您在“新建”中执行的操作。行动消失了。
当您遇到错误时,您的创建操作将转到else块并运行render 'new'
,从而从头开始呈现new.html.erb
模板,如果您使用@service变量呈现模板,则需要在呈现模板之前在操作中定义该变量。例如@service = Service.new
或@service = Service.find(params[:service_id])
。否则,您的模板会在title
对象上调用price
time
和nil
方法。
答案 1 :(得分:0)
您尚未再次传递服务ID以创建方法,因此可能无法在create中获取params [:service_id]。
使用service_id在表单中添加隐藏字段,然后检查。
<%= hidden_field_tag(:service_id,@service.id) %>