【问题标题】:Rails Remote form validation errors not showingRails 远程表单验证错误未显示
【发布时间】:2016-04-17 23:58:21
【问题描述】:

我在 Rails 4 中使用 remote: true 创建了一个 ajax 表单。由于某种原因,我错过了,我的验证错误没有显示在表单中。

这是我当前的代码库:

1.表格

= simple_form_for @foo, url: foos_path, as: :foo, remote: true do |f|

  .row
    .input-field
      = f.input :bar

  .right-align.card-button
    = f.button :submit, class: "waves-light blue", data: { disable_with: "Loading..." }

2。 create.js.erb

$("#new_foo").html('<%= j render_cell :foo, :form, foo: @foo %>');

3.控制器

def create
  @foo = FooForm.new( Foo.new )
  respond_to do |format|
    if @foo.validate(params[ :country ])
        @foo.save
        format.html { redirect_to root_path }
        format.json { render :show, status: :created, location: @foo.model }
        format.js 
    else
      format.html { render :new }
      format.json { render json: @foo.errors, status: :unprocessable_entity }
      format.js 
    end
  end
end

我希望此代码在错误提交后显示验证错误。然而,由于某种原因,在提交错误后没有任何反应。我可以确认表单正在提交,但是因为提交是在日志中处理的。我还可以确认当我删除远程提交时表单可以正常工作。

我有什么遗漏的吗?

PS。我正在使用Reform gem,这可能会使我的控制器目标代码对很多人来说有点陌生。我正在按照gem

在我的 js 文件中渲染一个单元格

更新 我已经为此挣扎了一些。我实现了一个解决方案,该解决方案逐字复制了我在以前的应用程序中构建的“远程:真实”解决方案。这在我以前的应用程序中完美运行,但在我的新应用程序中没有显示验证错误。这两个应用程序之间的唯一区别是 Ruby 和 Rails 的版本。

在第一个应用程序中,我运行 Ruby:2.2.1 和 Rails:4.2.2。我的新应用程序(“我无法运行的应用程序”)我正在运行 Ruby:2.2.3 和 Rails:4.2.4。

这可能有影响吗??

【问题讨论】:

  • 从您的回答中了解到render_cell,谢谢
  • 你能发布来自浏览器的准确的 HTML 响应吗?有趣的是它是如何工作的而不是remote
  • @RichPeck 感谢您的回复。很高兴我能帮上忙。这是一个很棒的小宝石,它对我清理代码有很大帮助。我不清楚你到底在问什么?我也用更多细节更新了我的问题。

标签: jquery ruby-on-rails ajax forms ruby-on-rails-4


【解决方案1】:

通过查看代码,我看到的唯一看起来有点不对劲的东西是渲染调用。如果我错了,请纠正我,但目前您不会将错误作为模型对象返回,而我认为您需要为其提供 errors 键。

format.json { render json: {errors: @foo.errors}, status: :unprocessable_entity }

或者,另外我相信如果您只返回对象本身,错误将被正确映射到对象内的 errors 键。

format.json { render json: @foo, status: :unprocessable_entity }

【讨论】:

  • 感谢@codeurge 的这次尝试。不幸的是仍然没有运气。我可以在我的 JS 控制台中看到正确的响应,但是我的表单中没有显示错误。
  • 我更新了我的问题,提供了更多细节。我尝试了很多方法,但仍然没有运气。
  • 鉴于您能够在 JS 控制台中看到 JSON 响应中的错误以及您在 HTML 响应中看到错误(remote: true 已删除)的附加信息 - 您可能需要第二意见,但我无法发现 simple_form 支持通过 AJAX 返回的错误呈现开箱即用。您可能必须将 simple_form 作为带有错误的 JSON 的部分返回,然后将该响应重新呈现给 DOM,或者编写一些代码来仅显示返回的错误。我怀疑这是因为您在这两种情况下都有错误,响应之间的唯一区别是重新渲染。
  • 上述推荐的一个例子可以在这里看到:stackoverflow.com/questions/15444473/…
【解决方案2】:

经过几个小时,我终于设法解决了这个问题。仍然不确定为什么会发生这种情况,但我在这里提出答案,以防其他人遇到类似的事情。 This Stackoverflow 的回答让我朝着正确的方向前进。

我需要将此行添加到我的创建操作中:

format.js    { render layout: false, content_type: 'text/javascript' }

因此我的完整创建操作现在看起来像这样:

def create
  @foo = FooForm.new( Foo.new )
  respond_to do |format|
    if @foo.validate(params[ :country ])
        @foo.save
        format.html { redirect_to root_path }
        format.json { render :show, status: :created, location: @foo.model }
        format.js 
    else
      format.html { render :new }
      format.json { render json: @foo.errors, status: :unprocessable_entity }
      format.js   { render layout: false, content_type: 'text/javascript' }
    end
  end
end

【讨论】:

  • 和你兄弟一样的问题。我添加了 remote = true 并且没有显示验证 - 我想这是因为没有提交表单。您对如何解决此问题有任何想法吗?
【解决方案3】:

它不起作用的原因是因为 AJAX 默认期望可解析的 javascript 作为响应,而不是 json 对象本身。您需要使用dataType: json 调整$.ajaxSetup,或者将'json' 作为最终参数传递给$.post(在回调之后),因此它将默认为预期json。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 2018-04-19
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-11
    相关资源
    最近更新 更多