jsの$()とか#とか

課題17

$("#error_messages").remove()

まず、このコードを細かく見ていく。"#error_messages"は、idがerror_messagesのものを対象とする、という意味で、removeは外すという意味なので、idがerror_messagesの表示があれば削除してくださいね、ということになる。これがないとどんどんエラーメッセージが溜まってしまう。

<% if @comment.errors.present? %>
   $("#new_comment").prepend("<%= j(render('shared/error_messages', object: @comment)) %>")
 <% else %>
   $("#js-table-comment").prepend("<%= j(render('comments/comment', comment: @comment)) %>")
   $("#js-new-comment-body").val('')
 <% end %>

少し長いけど、きちんと理解できるようにする。 一行目は、@commentにエラーがあるかどうかで分岐させている。エラーがあればtrue,なければfalseで分岐。

trueなら、idがnew_commentを対象にして、prepend(対象の前に挿入する)をしている。prependの中身は(" ")で囲んでいるので文字列にしている。erbなので、<%= %>で呼び出している。

j()ActionView::Helpers::JavaScriptHelper#escape_javascriptエイリアス。改行コード、シングルクォート、ダブルクォートをJacaScript用にエスケープしてくれる。エスケープとは、プログラム内で使用できない文字を、大体の文字に置き換えること。

render('shared/error_messages',object: @comment)では、sharedディレクトリの_error_messages.html.erbを呼び出す。その際にobjectを@commentに置き換えて呼び出す。

falseの場合、elseが処理されるので、$("js-table-comment")を対象として、その先頭に("<%= j(render('comments/comment', comment: @comment)) %>")を呼び出す。ということになる。

$("#js-new-comment-body").val('')は、idがjs-new-comment-bodyの値を''にするという動きをする。

参考

https://qiita.com/mm36/items/684f36f22e79d0a27ae9