###前提・実現したいこと
Rails 4.2.0
パーフェクトRuby on Rails(P.206~P.209)を参考に、ajaxを利用した処理(DB書き込み)を行おうとしています。
以下、長くて恐縮ですがよろしくお願いします。
<実現したい動作>
0. ビュー(show.html.erb)に設置しているform(text_field)に120文字以上のコメントを入力し、submitボタンをクリックすると、ajaxでcreateアクションを実行。
- コントローラーを経由して、submit内容をモデルに書き込もうとするが、モデルのvalidation(120文字以上のコメントを不許可)により書き込みが失敗し、422のステータスコードとともにJSONでエラーメッセージを返す。
- 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">×</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)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。