Голосование с Ajax в Rails - PullRequest
       3

Голосование с Ajax в Rails

1 голос
/ 20 октября 2010

Я пытаюсь разрешить пользователям голосовать за записи вверх / вниз с помощью Ajax. Я использую плагин voice_fu для функции голосования, и все работает без Ajax. Сейчас я пытаюсь найти наилучший способ реализовать асинхронную функциональность с помощью ненавязчивого JavaScript.

То, что я сейчас делаю, - это две кнопки «Вверх» и «Вниз», так что при нажатии любой из них делается запрос к утилите voice_controller и действию создания или обновления, в зависимости от того, был ли пользователь уже представил голосование по этой записи ранее. Представленные параметры будут равны record_id, а также значению голоса.

С Ajax, как мне справиться со случаем, когда пользователь заходит на страницу, чтобы проголосовать, не голосуя ранее? В частности, ссылки будут переходить к голосам # create в начале, но после этой первой отправки ссылки должны переключиться на голосов # update.

Есть ли стандартный способ позаботиться об этом? Я думал о том, чтобы просто добавить дополнительную проверку в методе «create», чтобы он действовал как «update», если бы он нашел запись для пары user_id, voiceable_id, но это казалось неуклюжим и не полностью RESTful.

Спасибо, Eric

Ответы [ 2 ]

1 голос
/ 20 октября 2010

Существует несколько методов / шаблонов, которые обычно используются:

1) Когда ваш эрб создает страницу, вы можете предоставить параметр JS-скрипту, который является частью страницы.Параметр будет равен «голосовать_урл», это будет или голос / новый или голос / 123, в зависимости от того, должна ли использоваться операция создания или обновления.

2) Вы можете использовать «вызов процедуры» вместовызов отдыха.Процедура / действие будет «change_vote» с параметром «вверх», который будет либо истинным, либо ложным.В случае необходимости действие создаст запись голосования или иным образом изменит ее.

3) Как часть процесса создания основной записи, вы могли бы всегда создавать элемент voice_record.Таким образом, операции голосования всегда будут обновляться, так как поле voice_record всегда будет уже существовать.

Добавлено

Re: комментарий когда это вообще "приемлемо"«отойти от отдыха?»

Отдых - это философия дизайна.Это решает много проблем, но не подходит для всех ситуаций.Я думаю, что ваш оригинальный вопрос будет в порядке, но в конечном итоге это зависит от вас, и кто бы ни пересматривал вашу архитектуру.Поскольку для этой функции можно «согнуть» ваше приложение в API для отдыха, некоторые могут попросить вас сделать это, чтобы получить преимущество, не нарушая Restfulness.

Re: ваш пример в вашем комментариио дружеских отношениях:

Поскольку имеет смысл «создать дружеские отношения», было бы лучше, при прочих равных условиях, выражать API как остальной вызов «объект / создание дружбы».Именно для вашего примера создания дружбы был создан отдых.- Альтернатива старого стиля заключается в том, что каждый разработчик API должен был определить большой набор имен процедур.

Rest обеспечивает более последовательный, стандартный способ создания имен.

Обратите внимание, что процедура "change_vote" лучше всего определена как часть объекта голосования:,Я считаю, что существует «путь Rails» для URL для процедур отдыха, которые не соответствуют стандартным глаголам отдыха.

0 голосов
/ 20 октября 2010

Другая идея заключается в том, чтобы изменить URL (возможно, через помощника) в зависимости от того, является ли запись новой.

Что-то вроде:

link_to_remote "Up", :url => voting_path(@vote)

module VotesHelper
  def voting_path(vote)
    if vote.new_record?
      new_voting_path
    else
      edit_voting_path(vote)
    end
  end
end
...