gpt4 book ai didi

javascript - 我 ajax a Rails 表单后未显示验证错误

转载 作者:行者123 更新时间:2023-11-28 03:31:39 25 4
gpt4 key购买 nike

我正在使用 ajax-rails 来呈现我的表单,并且验证停止工作。当我单击提交应验证的空表单时,验证不会生效,后端日志显示它发布了空表单。如果我不使用ajax,它工作得很好。我不知道我错过了什么。

型号

class ClockEntry < ApplicationRecord
belongs_to :user

validates :purpose, presence: true # I validated the attribute
end

index.html.erb

<div class="container" id="new-clock-entry">
<%= link_to 'New Clock Entry', new_clock_entry_path, remote: true, class: 'btn btn-primary btn-sm' %>
</div>

_form.html.erb

<%= simple_form_for clock_entry, remote: true do |f| %>
<%= f.error_notification %>
<%= f.error_notification message: f.object.errors[:base].to_sentence if f.object.errors[:base].present? %>

<div class="form-inputs">
<%= f.input :purpose %>
</div>

<div class="form-actions">
<%= f.button :submit, class: 'btn btn-primary btn-block btn-lg' %>
</div>
<% end %>

new.html.erb

<h1>New Clock Entry</h1>

<%= render 'form', clock_entry: @clock_entry %>

<%= link_to 'Back', clock_entries_path %>

new.js.erb

$('#new-clock-entry a').hide().parent().append("<%= j render 'form', clock_entry: @clock_entry %>")

create.js.erb

$('#new-clock-entry form').remove();
$('#new-clock-entry a').show();
$('table#clock-entry tbody').append("<%= j render @clock_entry %>");

Controller

def new
@clock_entry = ClockEntry.new
end

def create
@clock_entry = current_user.clock_entries.new(clock_entry_params)
@clock_entry.set_time_in

respond_to do |format|
if @clock_entry.save
format.js { redirect_to root_path, notice: 'Clock entry was successfully created.' }
format.html { redirect_to @clock_entry, notice: 'Clock entry was successfully created.' }
format.json { render :show, status: :created, location: @clock_entry }
else
format.html { render :new }
format.json { render json: @clock_entry.errors, status: :unprocessable_entity }
end
end
end

最佳答案

评论部分的@arieljuod 对我解决这个问题非常有帮助。正如他首先提到的,我并不是要求我的格式在create方法的else条件下响应js。这就是我所做的:

Controller 创建操作

将以下行添加到创建操作的 else 条件中:

format.js { render :new }

所以我的 Controller 操作变成:

def create
@clock_entry = current_user.clock_entries.new(clock_entry_params)
@clock_entry.set_time_in

respond_to do |format|
if @clock_entry.save
format.html { redirect_to @clock_entry, notice: 'Clock entry was successfully created.' }
format.js { redirect_to root_path, notice: 'Clock entry was successfully created.' }
format.json { render :show, status: :created, location: @clock_entry }
else
format.js { render :new } # Added this...
format.html { render :new }
format.json { render json: @clock_entry.errors, status: :unprocessable_entity }
end
end
end

new.js.erb 文件

然后在 new.js.erb 文件中,在渲染 :new 表单时,您需要删除或隐藏已有的内容并附加一个新表单有错误信息。因此,我必须通过在 new.js.erb 中提供要隐藏的 form 标记 来删除整个表单。因此,我将下面这一行添加到我的 new.js.erb 文件中:

$('#new-clock-entry form').hide().parent().append("<%= j render 'form', clock_entry: @clock_entry %>")

新的 new.js.erb 文件现在变成:

$('#new-clock-entry a').hide().parent().append("<%= j render 'form', clock_entry: @clock_entry %>")
$('#new-clock-entry form').hide().parent().append("<%= j render 'form', clock_entry: @clock_entry %>")

我认为这对于遇到同样问题的人来说应该很方便。

关于javascript - 我 ajax a Rails 表单后未显示验证错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58122741/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com