验证和渲染期间出现问题

时间:2016-12-08 02:27:33

标签: ruby-on-rails validation simple-form

提交表单时遇到问题。

我有两个模型,: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

2 个答案:

答案 0 :(得分:1)

我很确定这是因为在你的create方法中你还没有为@service变量赋值,在你的新方法中你实例化了@service变量(至少我假设你是和你一样)当你进入“动作”时没有出现错误,但是你没有在创建动作中这样做。

当您转到创建操作时,整个请求周期从头开始,这意味着您在“新建”中执行的操作。行动消失了。 当您遇到错误时,您的创建操作将转到else块并运行render 'new',从而从头开始呈现new.html.erb模板,如果您使用@service变量呈现模板,则需要在呈现模板之前在操作中定义该变量。例如@service = Service.new@service = Service.find(params[:service_id])。否则,您的模板会在title对象上调用price timenil方法。

答案 1 :(得分:0)

您尚未再次传递服务ID以创建方法,因此可能无法在create中获取params [:service_id]。

使用service_id在表单中添加隐藏字段,然后检查。

<%= hidden_field_tag(:service_id,@service.id) %>