質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

1回答

4821閲覧

[Rails]「ajax:error」イベントが発火しない

ryoryoryo

総合スコア8

CoffeeScript

CoffeeScriptはプログラミング言語です。シンタックスシュガーの導入により、JavaScriptのコードに変換された後動作します。JavaScriptに比べ、可読性と簡潔性が向上しています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2016/02/20 16:19

編集2016/02/21 00:34

###前提・実現したいこと
Rails 4.2.0
パーフェクトRuby on Rails(P.206~P.209)を参考に、ajaxを利用した処理(DB書き込み)を行おうとしています。
以下、長くて恐縮ですがよろしくお願いします。

<実現したい動作>
0. ビュー(show.html.erb)に設置しているform(text_field)に120文字以上のコメントを入力し、submitボタンをクリックすると、ajaxでcreateアクションを実行。

  1. コントローラーを経由して、submit内容をモデルに書き込もうとするが、モデルのvalidation(120文字以上のコメントを不許可)により書き込みが失敗し、422のステータスコードとともにJSONでエラーメッセージを返す。
  2. coffeescriptにより、ajax:errorが発火し、エラーメッセージを画面に出力する。

###発生している問題・エラーメッセージ
処理の正常終了時は問題なく動作していますが、エラー時の処理がうまく動きません。
具体的には上記の実現したい動作のうち、「3.」のcoffeescriptの処理が発生しません。

ビューに設置されているボタン押下後、下記のログメッセージ通り、サーバーがPOSTリクエストに対して処理を行い、バリデーションの結果422を返しています。

Started POST "/artists/1/my_artists" for ::1 at 2016-02-21 00:10:57 +0900 Processing by MyArtistsController#create as JS Parameters: {"utf8"=>"✓", "my_artist"=>{"comment"=>"[割愛(120文字以上の文字列)]"}, "button"=>"", "artist_id"=>"1"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] (0.1ms) begin transaction (0.3ms) rollback transaction Completed 422 Unprocessable Entity in 12ms (Views: 0.8ms | ActiveRecord: 0.5ms)

###ソースコード

  • app/views/artists/show.html.erb

html

1 <% if logged_in? %> 2 <button class="btn btn-primary btn-lg btn-block" data-toggle="modal" data-target="#createMyartist"> 3 登録ボタン 4 </button> 5 <div class="modal fade" id="createMyartist" tabindex="1" role="dialog" aria-labelledby="dialogHeader" aria-hidden="true"> 6 <div class="modal-dialog"> 7 <div class="modal-content"> 8 <div class="modal-header"> 9 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 10 <h4 class="modal-title" id="dialogHeader">コメント</h4> 11 </div> 12 <%= form_for(@artist.my_artists.build, url: artist_my_artists_path(@artist), remote: true) do |f| %> 13 <div class="modal-body"> 14 <%= f.text_field :comment, class: 'form-control' %> 15 </div> 16 <div class="modal-footer"> 17 <button type="button" class="btn btn-default" data-dismiss="modal">キャンセル</button> 18 <%= f.button '登録', class: 'btn btn-primary', data: { disable_with: '登録中…' } %> 19 </div> 20 <% end %> 21 </div> 22 </div> 23 </div>
  • app/controllers/my_artists_controller.rb

ruby

1 def create 2 my_artist = current_user.my_artists.build do |t| 3 t.artist_id = params[:artist_id] 4 t.comment = params[:my_artist][:comment] 5 end 6 if my_artist.save 7 flash[:notice] = 'このアーティストをマイアーティスト登録しました' 8 head 201 9 else 10 render json: { message: my_artist.errors.full_messages }, status: 422 11 end 12 end
  • app/assets/javascripts/my_artists.coffee

coffeescript

1$(document).on 'ajax:success', '#createMyartist', (xhr, data, status) -> 2 location.reload() 3 4$(document).on 'ajax:error', '#createMyartist', (xhr, data, status) -> 5 form = $('#new_my_artist .modal-body') 6 div = $('<div id="createMyartistErrors" class="alert alert-danger"></div>') 7 ul = $('<ul></ul>') 8 data.responseJSON.messages.forEach (message, i) -> 9 li = $('<li></li>').text(message) 10 ul.append(li) 11 12 if $('#createMyartistErrors')[0] 13 $('#createMyartistErrors').html(ul) 14 else 15 div.append(ul) 16 form.prepend(div)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決しました。

原因としてはコントローラ(app/controllers/my_artists_controller.rb)中の、
render json: { message: my_artist.errors.full_messages }, status: 422
の部分について、
messagesとすべきところをmessageとしているためでした。

単なるミスタイプですが、正直こういったミスの特定に対して良いデバッグ方法がわかりません。

投稿2016/02/21 00:37

ryoryoryo

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問