Rails - как сохранить переменные экземпляра между методами контроллера - PullRequest
2 голосов
/ 05 апреля 2011

Я изучаю рельсы и создаю простое приложение для вопросов / ответов, чтобы проверить некоторые из представленных мне концепций. Я использовал Generate Scaffold для создания двух классов моделей - Question и User.

Таблица вопросов состоит из question_number (int), question_text (строка) и answer_text (строка).

В таблице пользователей есть uid (строка), name (строка) и current_question (int)

Затем я создал контроллер с именем gateway. У меня есть приложение, работающее сейчас, где пользователь может перейти на главную страницу, передавая свой UID в качестве параметра (в конечном счете, будет передан функцией входа в систему), и приложение отобразит вопрос, над которым он в настоящее время работает, захватывая номер вопроса, который совпадает с текущий_пользователь Отлично.

Затем я создал метод ответа в контроллере шлюза. Этот метод берет ответ, который пользователь вводит в форму, и сравнивает его с ответом в базе данных, перенаправляя пользователя на разные страницы в зависимости от того, был ли ответ правильным или неправильным.

Моя проблема - я установил переменные экземпляра в методе index для установки текущего пользователя и текущего вопроса - но они не сохраняются в моем методе ответа. Какова лучшая практика Rails здесь? Должен ли я:

1) Передайте их как параметры методу ответа через форму, точно так же, как я передаю ответ (кажется неэффективным, когда я уже создал экземпляры vars в контроллере, а теперь передаю их обратно ...) 2) Хранить это как переменные в сеансе? 3) Хранить их во Flash? 4) Просто найдите их снова в методе ответа (не нравится повторять код, и 2 вызова для одной и той же информации кажутся бесполезными)

Я даже использую правильную структуру для этого приложения? Что бы вы сделали в этом случае, когда вы хотите получить атрибут пользователя (его текущий авторизованный вопрос) и использовать его несколько раз для запроса другой части базы данных (шаг 1 - получить вопрос, соответствующий авторизованному вопросу пользователя, шаг 2 - проверьте правильность введенных пользователем ответов, шаг 3 - увеличьте счетчик пользовательских вопросов)

больше информации, @ wukerplank

Нет плагинов для обработки сеансов. По сути, мой поток выглядит так:

  1. пользователь "login" (в этом небольшом тестовом приложении логика входа отсутствует, поэтому я просто передаю uid в качестве параметра в URL)
  2. Контроллер шлюза получает текущий вопрос пользователя с помощью @question = Question.where (:: question_number => @ user.current_question) .first
  3. Пользователь отображает текст вопроса и форму для ввода ответа
  4. Кнопка отправки вызывает my: answer action и передает строку ответа
  5. Здесь я бы хотел просто снова позвонить @question, но не могу, потому что это не сохраняется. Поэтому я должен либо повторить шаг 2, либо найти место для хранения данных, на которые мне нужно сослаться снова. Я предполагаю, что принципы DRY в Rails не рекомендуют повторять шаг 2, поэтому мне интересно, где и как лучше всего хранить их (и другие переменные, которые могут мне понадобиться) Спасибо!

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

Похоже, что хранение в сеансе будет уместным, в зависимости от того, какой уровень безопасности вы хотите.

В rails3 сессия фактически хранится в самом cookie и имеет ограниченный размер.Если переменные являются большими объектами, тогда создайте таблицу в базе данных и просто сохраните идентификатор в сеансе и просматривайте его каждый раз.

В качестве альтернативы вы можете использовать memcached или эквивалентный файл для хранения сеанса, а затем файл cookie простосохраняет идентификатор сеанса.

0 голосов
/ 05 апреля 2011

Я, вероятно, неправильно понял ваш вопрос, но обычная процедура будет такой:

  • Войдите в систему пользователя
  • сохраните его идентификатор в сеансе
  • перезагрузите пользователяпри каждом запросе от БД через его идентификатор в сеансе
  • сохранять соответствующую информацию (ход выполнения викторины и т. д.) в пользовательской таблице

Используете ли вы плагин для обработки сеанса(Придумайте, Authlogic и т. Д.)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...