Rails远程表单验证错误未显示

时间:2016-01-13 05:59:49

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

我使用remote:true在Rails 4中创建了一个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文件中渲染一个单元格

更新 我更加努力了。我实施了一个解决方案,我已经复制了一个'remote:true'解决方案,我已经在之前的应用程序中逐字构建了这个解决方案。这在我之前的应用程序中完美运行,但在我的新应用程序中不显示验证错误。这两个应用程序之间的唯一区别是Ruby和Rails的版本。

在第一个应用程序中,我使用Rails运行Ruby:2.2.1:4.2.2。我的新应用程序('我无法工作')我运行Ruby:2.2.3使用Rails:4.2.4。

这可能会产生影响吗?

3 个答案:

答案 0 :(得分:4)

经过几个小时,我终于设法解决了这个问题。仍然不确定为什么会这样,但我在这里提出答案,以防其他人遇到类似的事情。 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

答案 1 :(得分:1)

通过查看代码,我看到的唯一的东西似乎甚至略有不同 - 是渲染调用。如果我错了,请纠正我,但目前你不会将错误作为模型对象返回,而我认为你需要提供errors密钥。

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

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

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

答案 2 :(得分:1)

它不起作用的原因是因为AJAX默认期望将可解析的javascript作为响应,而不是json对象本身。您需要使用$.ajaxSetup调整dataType: json,或者通过&#39; json&#39;作为$ .post的最后一个参数(在回调之后),所以它默认预期json。