えいふくん

rails などの情報について

Rails + Ajax でエラーメッセージを実装する。

最近、同僚の人が、ajaxでエラーメッセージを実装していたので、勉強になりました。

ちなみに、ajaxで実装していたコメント機能に、エラーメッセージをつけるというものになります。

form viewにエラーメッセージを実装する

まず、エラーメッセージをform viewの中に実装しましょう。 このエラーメッセージは、scaffoldを実装する時にも、自動実装されるよくあるやつです。

【作業】

    <% if @comment.errors.any? %>
      <div id="error_explanation">
        <h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

        <ul>
          <% @comment.errors.full_messages.each do |message| %>
            <li><%= message %></li>
          <% end %>
        </ul>
      </div>
    <% end %>

【作業終わり】

<div id="error_explanation">

ajax処理のための、idを加えています。

controllerにエラーが出た時のajax処理を加える

コントローラーにエラーが出た時の、処理を加えます。

def create
  @comment = current_user.comments.build(comment_params)

  respond_to do |format|
      if @comment.save
        render :index, status: :created, notice: 'Comment was successfully created.'
      else
        render :error, status: :unprocessable_entity
      end
    end
  end

また、事前にviewにremote: :trueを加えてあるので、jsレスポンスがはしります。

viewのjs.erbを作成する

コントローラの次のviewを作成します。

views/comments/index.js.erb

$("#comments_area").html("<%= j(render 'comments/index' %>");
$('#error_explanation').remove();
$(':text').val('');

views/comments/form.js.erb

$("#comment-form").html("<%= j(render 'comments/form') %>");

form.js.erbはエラーメッセージの時だけ、発火し、index.js.erbは発火するとエラーメッセージを消します。

これで、ajaxでエラーメッセージを実装することができます。

また、本文では、escape_javascriptをjと略しています。 qiita.com