Вы могли бы сделать много вещей. Прежде всего я бы предложил использовать ajax с рельсовым путем. Это означает наличие ссылки upvote следующим образом:
#index.html
<h1>Wads Index</h1>
<ul>
<% @wads.each do |wad| %>
<li>
<%= wad.name %>
<div id="wad_<%=wad.id%>">
Upvotes: <%= wad.upvotes %>
</div>
<%= link_to upvote_wads_path(wad), remote: true, method: 'post' do %>
Upvote
<% end %>
</li>
<% end %>
</ul>
Обратите внимание, что у нас есть div, который имеет идентификатор вида wad_3
.
В link_to
используется синтаксис remote: true
, вместо вызова по этому пути сделать вызов ajax. Это вызовет WadsController#upvote
и увеличит количество голосов.
class WadsController < ApplicationController
def index
@wads = Wad.all
end
def upvote
@wad = Wad.find(params[:id])
@wad.upvotes = @wad.upvotes + 1
@wad.save
end
конец
После выполнения WadsController#upvote
действие вызовет представление, но представление теперь будет не html, а файлом javascript (js
) с некоторым встроенным рубином (erb
) с именем upvote.js.erb
, И должно быть что-то вроде этого:
$('document').ready(function() {
var div = $('#wad_<%= @wad.id %>');
div.empty().html("Upvotes: <%= @wad.upvotes %>");
});
Этот файл принимает обновленный @wad
, находит свой счетчик дивизий upvotes и обновляет его содержимое новым счетчиком upvotes.
Конечно, чтобы все работало, вы должны определить маршруты для контроллера.
Rails.application.routes.draw do
root 'wads#index'
resources :wads do
collection do
post 'upvote/:id', to: 'wads#upvote', as: 'upvote'
end
end
end
Если вы хотите больше узнать о работе с Javascript и Ajax в Rails, прочитайте официальную документацию здесь