繁体   English   中英

Rails form_for部分渲染失败的验证和正确的验证

[英]Rails form_for partial rendering both failed validation and correct validation

我在我的视图中使用form_for remote:true并进行了一些验证,这触发了JS响应以将部分代码追加到div:

index.html.erb

<%= bootstrap_form_for @reservation, html: { id: "createReservationForm", method: :post }, remote: true do |f| %>
  <div id="error_div"></div>
  <%= f.datetime_select :start_time, ampm: true, discard_minute: true, :minute_step => 60 %>
  <%= f.select :party_size, (1..6).map { |i| [i,i] } %>
  <%= f.text_field :name, required: true %>
  <%= f.hidden_field :restaurant_id, value: @restaurant.id %>
  <%= f.submit 'Create Reservation', id: "formSubmit" %>
<% end %>

reservations_controller.rb

def create
    @reservation = Reservation.new(reservation_params)
    @reservation.start_time = @reservation.start_time.beginning_of_hour
    @reservation.end_time = @reservation.start_time + 1.hour

    respond_to do |format|
      if @reservation.save
        format.html { render action: 'index' }
        format.js   { render action: 'create', status: :created, location: @reservation }
      else
        format.html { render action: 'index' }
        format.js   { render action: 'create', status: :unprocessable_entity, errors: @reservation.errors.full_messages }
      end
    end
  end

reservation.rb

  validates :start_time, presence: true
  validates :name, presence: true
  validates :party_size, presence: true
  validate  :not_past

  def not_past
    if start_time.past?
      errors.add :start_time, "cannot be in past"
    end
  end

create.js.erb

$("#createReservationForm").on("ajax:success", function(e, data, status, xhr) {
  $("#error_div").html('');
  $("#reservationList").prepend("<%= j render partial: 'reservation', locals: { reservation: @reservation } %>")
  $("#createReservationForm")[0].reset();
  return false;
}).on("ajax:error", function(e, xhr, status, error) {
  $("#error_div").html("<%= j render partial: 'shared/error_messages', locals: { object: @reservation } %>")
  return false;
});

我遇到的问题是,当我说提交未通过“ not_past”验证的表单时,我收到错误消息,并且没有提交。 然后,当我调整表单上的时间以使其通过“ not_past”验证时,它将附加新的@reservation以及先前提交的未通过验证的代码。 是否有办法以某种方式“清除”失败的前一个,以便当用户调整表单上的时间以通过验证时,它仅附加该版本的内容?

我试过弄乱'return false;',在创建新控制器之前,我曾尝试在控制器中将@reservation设置为nil,我也确实将“ @reservation”放入了respond_to块中,它只给了我正确的答案一,所以我不确定错误的位置在哪里。

如果有人遇到相同的问题,我发现可以通过删除“ ajax:success”和“ ajax:error”代码来解决。 我无法证明为什么它阻止了它的正常运行,我只知道它能够修复它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM