2010-10-20 3 views
1

Я пытаюсь разрешить пользователям проголосовать за запись вверх/вниз с помощью Ajax. Я использую плагин vote_fu для функции голосования, и все работает отлично без Ajax. Теперь я пытаюсь найти лучший способ реализовать асинхронную функциональность с ненавязчивым javascript.Голосование с Ajax in Rails

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

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

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

Спасибо, Эрик

ответ

1

Есть несколько методов/шаблоны часто используемых:

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

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

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

Добавлено

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

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

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

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

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

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

+0

Я думал о том, только с помощью вызова процедуры, но из любопытства, когда это вообще «приемлемый» отойти от отдыха звонка? Например, если у вас есть дружеские отношения между пользователями, вы бы подружились с FriendshipsController # create или UsersController # addFriend? – Eric

+0

Обновлен ответ re Ваш комментарий. –

0

Другой идеей было бы изменить 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