Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 用于部分呈现的Rails表单_验证失败,验证正确_Jquery_Ruby On Rails_Ruby_Validation - Fatal编程技术网

Jquery 用于部分呈现的Rails表单_验证失败,验证正确

Jquery 用于部分呈现的Rails表单_验证失败,验证正确,jquery,ruby-on-rails,ruby,validation,Jquery,Ruby On Rails,Ruby,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> <%=

在我的视图中,我使用了一个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 %>
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;
});
$(“#createReservationForm”)。关于(“ajax:success”,函数(e、数据、状态、xhr){
$(“#error_div”).html(“”);
$(“#reservationList”)。前缀(“”)
$(“#createReservationForm”)[0]。重置();
返回false;
}).on(“ajax:error”,函数(e、xhr、状态、错误){
$(“#error_div”).html(“”)
返回false;
});
我遇到的问题是,当我说提交一个未通过“not_past”验证的表单时,我收到错误消息,但它没有提交。然后,当我调整表单上的时间以使其通过“not_pass”验证时,它会附加新的@reservation以及之前提交的未通过验证的@reservation。是否有一种方法可以“清除”前一个失败的表单,这样当用户调整表单上的时间以通过验证时,它只会附加该版本的表单


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

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

$("#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;
});