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

时间:2013-01-04 10:09:05

标签: ruby-on-rails ajax forms

我正在尝试以我的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

帖/ 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 %>

帖/ 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的POST / / posts   由PostsController处理#create为JS参数:{“utf8”=&gt;“✓”,   “authenticity_token”=&gt; “中Qfn6HsPPDxyB1t4bM / OQKPbJ / aoAMkp74y0Z6xkoXCY =”,   “post”=&gt; {“title”=&gt;“”,“content”=&gt;“”,“tag_list”=&gt;“”},   “_wysihtml5_mode”=&gt;“1”,“commit”=&gt;“保存草稿”}用户负载(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   25ms(浏览次数:11.2ms | ActiveRecord:1.0ms | Solr:0.0ms)

可能是什么问题?

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

修改

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

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

几天前我一直面临类似的问题。我在表单中使用remote => true选项在我的Rails 3应用程序中使用Ajax。之后,我一直在寻找验证表单字段的解决方案。在尝试了大量的jQuery / Javascript方法之后(虽然它们都没有为我工作)但我开始了解一个名为client_side_validations的精湛宝石。按照github链接(https://github.com/bcardarella/client_side_validations)上的说明安装非常简单。它的工作方式就像表单字段的客户端验证一样,确实是一个很棒的宝石。希望这对那些厌倦了在Rails 3应用程序中使用Ajax后寻找模型字段的客户端验证的简单解决方案的人有所帮助。