无法在 Rails “remote: true” 表单中显示错误?

Posted

技术标签:

【中文标题】无法在 Rails “remote: true” 表单中显示错误?【英文标题】:Can't get errors to be displayed in an Rails "remote: true" form? 【发布时间】:2012-12-18 18:23:50 【问题描述】:

我正在尝试在我的 ajax 表单中显示错误消息(代码基于 this 问题):

posts_controller.rb:

  def create
    @post = current_user.posts.build(params[:post])
    if params[:commit] == "Publish"
      @post.status = "Published"
    elsif params[:commit] == "Save Draft"
      @post.status = "Draft"
    end

    respond_to do |format|
      format.html do
        if @post.save && @post.status == "Published"
          flash[:success] = "Post published"
          redirect_to @post
        elsif @post.save && @post.status == "Draft"
          flash[:success] = "Post saved as draft"
          render 'edit'
        else
          render 'new'
        end
      end
      format.js do
        @post.save
      end
    end
  end

posts/create.js.erb:

<% if @post.errors.any? %>
  alert('There are errors.');
  <%= render :partial=>'js_errors', :locals=>  :target=> @post  %>
<% else %>
  $('.busy').html('Saved.');
<% end %>

js_errors.js.erb:

<% target.errors.full_messages.each do |error| %>
  $('.busy').append('<p><%= escape_javascript( error ) %></p>');
<% end %>

posts/new.html.erb:

<%= form_for(@post, remote: true, :html =>  :multipart => true ) do |f| %>
  <%= render 'fields', f: f %>
  <div class="form-actions">
    <%= f.submit "Publish", class: "publish btn btn-primary pull-left" %>
    <%= f.submit "Save Draft", class: "save-draft btn btn-default pull-left" %>
    <div class="busy pull-left">
    </div>
  </div>
<% end %>

但由于某种原因,什么都没有显示(.busy 始终为空)。

在控制台中我可以看到正在显示js_errors.js.erb

在 2013-01-04 18:02:18 +0800 开始为 127.0.0.1 发布“/posts” PostsController#create as JS 参数处理:"utf8"=>"✓", "authenticity_token"=>"Qfn6HsPPDxyB1t4bM/OQKPbJ/aoAMkp74y0Z6xkoXCY=", "post"=>"title"=>"", "content"=>"", "tag_list"=>"", "_wysihtml5_mode"=>"1", "commit"=>"保存草稿" 用户负载 (0.7ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'ljl0ZsuoiHg0Jilz8bgy-g' LIMIT 1 (0.2ms) 开始交易 (0.2ms) 回滚事务渲染的帖子/_js_errors.js.erb (3.8ms) 渲染帖子/create.js.erb (7.5ms) 完成 200 OK in 25 毫秒(查看:11.2 毫秒 | ActiveRecord:1.0 毫秒 | Solr:0.0 毫秒)

可能是什么问题?

(如果我从表单中删除 remote:true,我会看到验证消息)。

编辑:

我注意到alert('There are errors.'); 没有被触发。奇怪。

【问题讨论】:

【参考方案1】:

这看起来像是一个命名问题。您要求渲染 partial js_errors,这将被称为 _js_errors.js.erb;但你说你的文件实际上叫做js_errors.js.erb(没有前导下划线)。

尝试添加下划线,看看是否有帮助。

【讨论】:

堆栈跟踪显示该文件的标题为_js_errors.js.erb,并且它正在正确呈现。 @Chowlett 我发现了错误。我在文件顶部有这个:&lt;%#&lt;% elsif @post.status == "Published" &amp;&amp; @post.id? %&gt;%&gt; 以某种方式触发了“静默错误”。对不起。我们应该怎么做删除问题或回答我自己的问题? 如果我是你,我会删除它,很高兴你修复了它:) @alexchenco - 可能删除它。它不会对后代有用!【参考方案2】:

几天前我也遇到过类似的问题。我在表单中使用了remote =&gt; true 选项,以便在我的Rails 3 应用程序中使用Ajax。之后,我一直在寻找验证表单字段的解决方案。在尝试了大量的 jQuery / Javascript 方法(尽管它们都不适合我)之后,我开始了解一个名为 client_side_validations 的极好的 gem。按照 github 链接 (https://github.com/bcardarella/client_side_validations) 上的说明进行安装非常容易。它对于表单字段的客户端验证就像魅力一样,确实是一个很棒的宝石。希望这对那些厌倦了在 Rails 3 应用程序中使用 Ajax 后寻找简单的模型字段客户端验证解决方案的人有所帮助。

【讨论】:

以上是关于无法在 Rails “remote: true” 表单中显示错误?的主要内容,如果未能解决你的问题,请参考以下文章

Rails form_with(remote:true)错误

kaminari 通过 ajax 分页,remote = true 不影响 Rails 3 中的视图

Rails 6.0.4 远程:true 不在浏览器中 js/ajax 渲染 _partial.html.erb

Rails AJAX 远程:true 与动态 id

Rails ajax 响应和 DELETE 方法

Rails:使用 ajax 填充引导下拉列表