Ваше описание совершенно верно!В отличие от другого ответа, вам даже не нужен прослушиватель событий, но, как вы сказали, вы хотите иметь respond_to
в контроллере.Итак, начиная с html:
# post/index.html.erb
<div id="like-button">
<%= button_to "Like this post", post_path(@post), remote: true %>
</div>
Обратите внимание, что при использовании помощника button_to
это будет запрос POST по умолчанию.
Если вы щелкните по нему, он будетперейдите к controller#update
, который вы хотите изменить на это:
#posts_controller.rb
...
def update
@post.save
respond_to do |format|
format.html { redirect_to post_path(@post) }
format.js # <-- will render `app/views/posts/update.js.erb`
end
end
Примечание: format.html
отображается при отключении JS.Теперь в сценарии, в котором включен JS, он выполняет файл app/views/posts/update.js.erb
.Это может выглядеть так:
const likeButton = document.getElementById('like-button');
likeButton.innerHTML = '<%= j render "posts/liked-link", post: @post %>';
Что делает последняя строка?Конечно, вы можете изменить стиль напрямую с помощью JavaScript, но вы также можете отобразить новый фрагмент - и вы создадите его в новом html-файле:
# app/views/posts/liked_link.html.erb
<div id="like-button ">
<p>"You liked this post!" </p>
</div>
Я просто изменил ссылку / кнопку наp
сейчас, но, конечно, вы можете делать все, что захотите.
Надеюсь, это имеет смысл:)