M. 9 Coffee - Evanto/qna GitHub Wiki
app/assets/javascripts/votes.coffee:
votes = ->
$(document).on 'click', '.vote-link', (e) ->
e.preventDefault();
value = $(this).data('value')
votable_id = $(this).data('votableId')
votable_type = $(this).data('votableType')
$.ajax
type: "POST"
url: "/votes"
data:
value: value
votable_id: votable_id
votable_type: votable_type
success: (rating) ->
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .reset-vote-link').show()
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .vote-link').hide()
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .rate').html(rating)
error: ->
$('div.errors').html('Something is wrong.')
$(document).on 'click', '.reset-vote-link', (e) ->
e.preventDefault();
votable_id = $(this).data('votableId')
votable_type = $(this).data('votableType')
$.ajax
type: "DELETE"
url: "/votes/reset?" + $.param({"votable_id": votable_id, "votable_type" : votable_type})
success: (rating) ->
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .vote-link').show()
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .reset-vote-link').hide()
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .rate').html(rating)
error: ->
$('div.errors').html('Something is wrong.')
$(document).on('turbolinks:load', votes)
$(document).on('page:load', votes)
$(document).on('page:update', votes)
$.ajax
- performs an Ajax request (an asynchronous HTTP request)
url: "/votes"
- a string containing the URL to which the request is sent
data:
value: value
votable_id: votable_id
votable_type: votable_type
- data to be sent to server (type: PlainObject or String or Array)
success: (rating) ->
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .reset-vote-link').show()
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .vote-link').hide()
$('#' + votable_type.toLowerCase() + '_' + votable_id + ' .rate').html(rating)
- a function to be called if the request succeeds
Создаем контроллер votes_controller.rb
с экшенами create
и destroy
(т.к. будем создавать и удалять голоса), прописываем ответ через json. В routes.rb
добавляем пути на них:
resources :votes, only: [:create] do
delete :reset, on: :collection
end
Во вьюхе трем ссылкам прописываем классы, а у самого дива вопроса/ответа должен быть id. Тут же у этих ссылок приписываем data
и style
.
В votes.coffee
создаем 2 ajax-запроса (обернуте в функции) на экшены контроллера, которые мы создали выше: для create
с методом POST
, для destroy
- c DELETE
. url
-ы берем из rake routs
- смотрим там сзданные ранее урлы для votes create
, votes destroy
. В success пишем, какую ссылку скрыть/показать и заменяем .rate
на html(rating)
. В случае ошибки заменяем див ошибки на текст об ошибке.