Как в приложении Rails 3 разрешить анонимным пользователям доступ к действию контроллера только один раз?

Например, предположим, что у меня есть блог, и любой может читать статьи, читать комментарии и помечать любой комментарий как неприемлемый. Как сделать так, чтобы незарегистрированные пользователи не нажимали ссылку «Отметить комментарий» более одного раза?

Ссылка «Отметить комментарий» будет напрямую привязана к методу контроллера для модели комментариев.

Я новичок в идее сеансов и файлов cookie (а также в Rails в целом). Я читал это на Sessions, но, боюсь, я все еще немного запутался .

Я рассматривал возможность создания базового класса с именем Guest, но мне было интересно, могу ли я избежать этого и вместо этого использовать временные данные сеанса или файлов cookie.

Заранее спасибо.


person John Bullhuo    schedule 07.10.2011    source источник


Ответы (1)


Основная идея может быть следующей (извините, пока нет кода):

  1. Определите, какая информация должна храниться в сеансе и/или в файле cookie. Я думаю, что это должно быть id из comment для каждого помеченного комментария. Храните их в хэш-подобной структуре.
  2. Сделайте ссылку на flagging a comment в зависимости от содержимого файла cookie. Что-то такое:

    ...
    = link_to('flag comment', flag_comment_path(comment.id)) if ! cookies[:flagged_comments] || ! cookies[:flagged_comments][comment.id]
    
  3. Установите хеш-значение куки, когда комментарий помечен (используйте здесь локальную переменную comment, она должна быть где-то установлена ​​или известна):

    cookies[:flagged_comments] = Hash.new if ! cookies[:flagged_comments]
    cookies[:flagged_comments][comment.id] = comment.id
    

Не знаю, сработает ли код, но идея должна быть ясна. И да, делайте это только для анонимных пользователей (более зависимая функциональность пользовательского интерфейса и контроллера).

Еще одна вещь: я не думаю, что вам следует использовать сеанс и файлы cookie для хранения этой информации. И из-за того, что вы должны замечать, когда кто-то отмечает комментарий в двух разных сеансах, используйте только файлы cookie.

person mliebelt    schedule 08.10.2011
comment
Спасибо за чаевые! Я попытаюсь включить элементы того, что вы сказали, в свой код и посмотрю, как это работает! - person John Bullhuo; 09.10.2011
comment
Не могу заставить его работать. Когда я пробовал cookies[:flagged_comments][id] = id в своем контроллере, я продолжал получать ошибку Undefined local variable or method id. Кроме того, можете ли вы объяснить свое выражение if? Мне кажется, что ссылка будет активной только в том случае, если были установлены значения хэша cookie (разве не должно быть наоборот?). - person John Bullhuo; 13.10.2011
comment
Я изменил логику (вы были правы, флаг разрешен только в том случае, если он не был установлен ранее). Идентификатор исходит из комментария, поэтому я добавил comment.id, чтобы было понятно, какой идентификатор здесь нужен. - person mliebelt; 13.10.2011
comment
Все равно не повезло. Когда я пытаюсь cookies[:flagged_comments][@comment.id] = @comment.id, я получаю сообщение об ошибке Can't convert Fixednum into string, поэтому я пробовал cookies[:flagged_comments]["#{@comment.id}"] = @comment.id только для того, чтобы получить ошибку string not matched. - person John Bullhuo; 15.10.2011
comment
Я даже пробовал cookies[:flagged_comments] = cookies[:flagged_comments].to_s.split(',').push(params[:id].to_s).join(',') в действии контроллера, затем link_to('flag comment', flag_comment_path(comment.id)) if (cookies[:flagged_comments].to_s.split(',')).include?(comment.id) в представлении, но это не сработало (по крайней мере, без ошибок). - person John Bullhuo; 15.10.2011
comment
Возможно, вам следует сделать шаг назад и сначала попытаться сохранить и загрузить файл cookie (независимо от статуса пользователя). Я не знаю, какая структура данных разрешена в файле cookie, возможно, это должна быть строка. Проверьте вопрос stackoverflow.com/questions/4576875/rails-3-cookies и ссылку ruby.railstutorial.org/chapters/ - person mliebelt; 15.10.2011
comment
Да, я читал и то, и другое. Я хотел избежать создания отдельного файла cookie для каждого комментария, но, по крайней мере, это работает. Спасибо за вашу помощь! - person John Bullhuo; 17.10.2011