2

エラーメッセージを ajax フォームに表示しようとしています (コードはこの質問に基づいています):

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コンソールでは、次のように表示されていることがわかります。

127.0.0.1 の POST "/posts" を 2013-01-04 18:02:18 +0800 で開始しました PostsController#create as JS パラメータによる処理: {"utf8"=>"✓", "authenticity_token"=>"Qfn6HsPPDxyB1t4bM/ OQKPbJ/aoAMkp74y0Z6xkoXCY=", "post"=>{"title"=>"", "content"=>"", "tag_list"=>""}, "_wysihtml5_mode"=>"1", "commit"= >"Save Draft"} User Load (0.7ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'ljl0ZsuoiHg0Jilz8bgy-g' LIMIT 1 (0.2ms) トランザクションの開始
(0.2ms) トランザクションのロールバックレンダリングされた posts/_js_errors.js.erb (3.8ms) レンダリングされた posts/create.js.erb (7.5ms) 25ms で 200 OK を完了 (Views: 11.2ms | ActiveRecord: 1.0ms | Solr: 0.0ms)

何が問題なのですか?

(フォームから削除すると、検証メッセージが表示されますremote:true)。

編集:

alert('There are errors.');トリガーされていないことに気付きました。変。

4

2 に答える 2

0

ネーミングの問題のようです。;と呼ばれる部分的な ;をレンダリングするように求めています。しかし、ファイルが実際に呼び出されていると言います(先頭のアンダースコアはありません)。js_errors_js_errors.js.erbjs_errors.js.erb

アンダースコアを追加してみて、問題が解決するかどうかを確認してください。

于 2013-01-04T10:16:41.833 に答える
0

私は数日前に同様の問題に直面しています。remote => trueRails 3 アプリケーションで Ajax を使用するために、フォームでオプションを使用しました。その後、フォーム フィールドを検証するための解決策を探していました。かなりの数の jQuery/Javascript アプローチを試した後 (どれもうまくいきませんでしたが)、client_side_validations という優れた gem について知りました。github リンク ( https://github.com/bcardarella/client_side_validations )の指示に従ってインストールするのは非常に簡単です。これは、フォームフィールドのクライアント側の検証の魅力のように機能し、本当に素晴らしい逸品です。Rails 3 アプリケーションで Ajax を使用した後、クライアント側でモデル フィールドを検証するためのシンプルなソリューションを探すのにうんざりしている人々に、これが役立つことを願っています。

于 2013-03-22T19:38:49.027 に答える