ajaxのhtmlとreplaceWithメソッドの違い
ajaxのhtmlとreplaceWithメソッドの違い
htmlとreplaceWithを使った際の違いを、デベロッパーツールで確認していこうと思います。
前書き
htmlメソッド
指定したタグの中身をhtmlタグ付きで変える
replaceWithメソッド
指定したタグの中身をhtml付きで変えて、タグ自体も変える
※タグとは、pはh1、h2など
今回検証するベースは以下になります。
bookmarks_controller.rb
def create @board = Board.find(params[:board_id]) current_user.bookmark(@board) end def destroy @board = current_user.bookmarks.find_by(board_id: params[:id]).board current_user.unbookmark(@board) end
_board.html.erb
<%= render 'bookmarks/bookmark_area', board: board %>
_bookmark_area.html.er
<% if current_user.bookmark?(board) %> <%= render 'bookmarks/unbookmark', board: board %> <% else %> <%= render 'bookmarks/bookmark', board: board %> <% end %>
_bookmark.html.erb
<li class="list-inline-item"> <%= link_to board_bookmarks_path(board), id: "js-bookmark-button-for-board-#{board.id}", method: :post, remote: true do %> <%= icon("far", "star") %> <% end %> </li>
_unbookmark.html.erb
<li class="list-inline-item"> <%= link_to bookmark_path(board), id: "js-bookmark-button-for-board-#{board.id}", method: :delete, remote: true do %> <%= icon("fas", "star") %> <% end %> </li>
今回は、以下のファイルをメインに検証します。
create.js.erb
destroy.js.erb
※bookmarks_controller.rbのcreate処理が終わった後、create.js.erbが読み込まれます。
(destroyも然り)
その際の、挙動を確認する記事になります。
htmlメソッドを使用した場合
まず、一覧に表示されているスターのHTMLは以下になります。
<a id="js-bookmark-button-for-board-20" data-remote="true" rel="nofollow" data-method="post" href="/boards/20/bookmarks"> <i class="far fa-star"></i> </a>
create.js.erb
$("#js-bookmark-button-for-board-<%= @board.id%>").html("<%= j(render 'bookmarks/bookmark_area', board: @board) %>");
destroy.js.erb
$("#js-bookmark-button-for-board-<%= @board.id%>").html("<%= j(render 'bookmarks/bookmark_area', board: @board) %>");
実際に画面からスターボタンを押してみます。
<div id="js-bookmark-button-for-board-20"> <li class="list-inline-item"> <a id="js-bookmark-button-for-board-20" data-remote="true" rel="nofollow" data-method="delete" href="/bookmarks/20"> <i class="fas fa-star"></i> </a></li> </div>
変化しましたね。冒頭で記載した、「指定したタグの中身をhtmlタグ付きで変える」ように
aタグのidを判別して、ネストした形で記載されているのがわかります。
replaceWithメソッドを使用した場合
create.js.erb
$("#js-bookmark-button-for-board-<%= @board.id%>").replaceWith("<%= j(render 'bookmarks/bookmark_area', board: @board) %>");
destroy.js.erb
$("#js-bookmark-button-for-board-<%= @board.id%>").replaceWith("<%= j(render 'bookmarks/bookmark_area', board: @board) %>");
実際に画面からスターボタンを押してみます。
<a id="js-bookmark-button-for-board-20" data-remote="true" rel="nofollow" data-method="post" href="/boards/20/bookmarks"> <i class="far fa-star"></i> </a>
こうですね、冒頭で書いた通り「指定したタグの中身をhtml付きで変えて、タグ自体も変える」ため
ネストした状態ではなく、指定したタグ含めて全体が変わったことがわかります。
まとめ
それぞれの仕組みを理解して、RailsはHTMLを意識して書いていくときれいなWebアプリが作れるなと
実感しました。