LINUX.ORG.RU

rails tutorial


0

0

В рельсах новичек.
Не могу найти туториал по созданию тестов\викторин на RoR.
Т.е. пользователь вводит логин, для него создается сессия и начинается тест. Из базы берутся вопросы, пользователь на них отвечает, ответы сохраняются. В конце выдаются результаты. По идее не сложно, но некоторые вещи не понятны.
Что-нибудь подобное в каком-нибудь туториале создавалось? А то возникло уже довольно много вопросов...

★★★★★

>Не могу найти туториал по созданию тестов\викторин на RoR.

см. также: дельфи.

см. также: помогите найти компоненту.

см также: в школе задали зодачу на бейсике, помагити решить!

бери любой учебник и не выделывайся, чо там особенного-то?

Unclown
()

Короткий ответ: конечный автомат.

В книжке Advanced Rails Recipes есть рецепт, как раз посвященный созданию теста с помощью популярного плагина для создания конечных автоматов - http://github.com/rubyist/aasm ( устанавливай по инструкциям из этой ссылки, в advanced rails recipes устаревшая инфа ).

Стоит иметь в виду, что в транке ( Rails 3.0 beta ) есть собственная реализация, ActiveRecord::StateMachine ( и более общее api ActiveModel::StateMachine, независимое от ORM ), http://blog.envylabs.com/2009/08/the-rails-state-machine/ , так что если ты пишешь для реального приложения, учитывай, что будешь использовать эту библиотеку при возможном переходе на Rails 3.

volh ★★
()
Ответ на: комментарий от Unclown

>бери любой учебник и не выделывайся, чо там особенного-то?

Особенного то, что веб - stateless. Плюс то, что рельсы используют REST-like URLs и некоторые соглашения, которым лучше следовать для поддерживаемости кода. Соответственно обычные пхп-практики вроде " а сделаем-ка мы все в одном и том же урле pupkin.com/quiz и закинем все параметры в сессию " не проходят ( мало того что некрасиво, так еще и из-за REST-ориентированности весь фреймворк будет сильно мешать делать такие штуки ).

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

А как ты делал визарды для веба?)

volh ★★
()
Ответ на: комментарий от Unclown

оффтоп. хороший текст в профайле. это шизофазия, да? мой любимый отрывок)

volh ★★
()

Если kovrik.net - это твое ( скорее всего так и есть ) - как ты насчет оказывать услуги rails-верстальщика? Самому мне иногда тяжеловато. Ничего особенного не нужно, просто кросс-браузерная грамотная верстка и CSS(иногда просто CSS), может чуть-чуть js.

Не сейчас, вообще на будущее интересуюсь. Уже года полтора-два как страдаю, то верстают фигово, то простых рельсовых шаблонов не понимают, то просто на***вают. Почти уже сам научился, но вот зафигачить модульную сетку, создать «безопасную» цветовую гамму, просто из psd сделать html, в тех случаях где нанимать дизайнерскую контору никто не хочет из-за простоты проекта - для меня мучение.

volh ★★
()
Ответ на: комментарий от volh

Сам да, пытался уже сделать, но результат не очень устраивает.
Может есть какой-нибудь gem ?

kovrik.net к сожалению не мое.

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

>Может есть какой-нибудь gem ?

Ты совсем-совсем не читал мой первый пост?

gem install aasm

anonymous
()

читал.
Но использовать для этого конечные автоматы - не слишком ли сложно?
Во-первых не понравилось то, что все состояния и переходы описываются в модели.
Во-вторых мне тут важен не столько переход из одного состояния в другое, сколько сама возможность загружать вопросы и отвечать на них. Что если я захочу вопросы в случайном порядке выдавать, а не в заданной автоматом последовательности?

Ведь фактически надо что (модели):
есть Quiz (тест) у которого список вопросов (question_id)
есть Question (вопрос), у которого text
есть Choice (выбор) - text, question_id
есть Response (выбор юзера) - question_id, choice_id, user_id
есть Answer (ответ) - question_id, choice_id
есть User - name

Пользователю выдается тест (выбирается вопрос с question_id из списка вопросов).
Показывается сам вопрос и ответы с нужным question_id
После выбора ответа - создается response - юзер с id таким-то ответил на такой-то вопрос так-то
В конце сверяется результаты (по таблице answers).

Хочется сделать как-то так. Но проблемы именно в реализации.

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

>Но использовать для этого конечные автоматы - не слишком ли сложно?

That varies. В основном - не слишком. Иногда бывает overkill, но это сразу понимаешь.

Во-вторых мне тут важен не столько переход из одного состояния в другое, сколько сама возможность загружать вопросы и отвечать на них. Что если я захочу вопросы в случайном порядке выдавать, а не в заданной автоматом последовательности?


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

volh ★★
()
Ответ на: комментарий от volh

Ну вот в данный момент и пытаюсь реализовать то, что описал. Затык в том, что будучи новичком, еще не очень то разобрался с рельсами.
Модель создал, забил тестовыми данными - с этим проблем нету.
Проблема - связать теперь это все, чтобы работало.
Допустим, вывожу вопрос и список вариантов ответов на него (radio_button'ами).
hidden_field'ом передаю @question.id.
Так же hidden_field'ом хотелось бы передавать хранящийся в сессии user_id ( сессии пока не делал, не разобрался).
Как теперь реализовать сам ответ на вопрос? Чтобы выбранный radio_button передавался в качестве choice_id, user_id и question_id брались из hidden_field'ов и все это записывалось в таблицу Responses ?

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

Допустим, вывожу вопрос и список вариантов ответов на него (radio_button'ами).

Допустим.

hidden_field'ом передаю @question.id.

Я бы советовал избегать hidden_field'ов без особой нужды в них. Например, если у тебя список вопросов выводится в /quizzes/1/questions/2 ( форма может вызывать не update в QuestionController, а скажем, answer, неважно ), то никаких скрытых полей не надо. Пусть определенный вопрос однозначно задается URL'ом, так ведь намного проще.

Так же hidden_field'ом хотелось бы передавать хранящийся в сессии user_id ( сессии пока не делал, не разобрался).

Тебе и не нужно «делать» сессии, если ты используешь стандартные методы аутентификации ( обычно restful_authentication ), пользователь (очевидно) уже в сессии, в контроллере вызываешь current_user.

Как теперь реализовать сам ответ на вопрос? Чтобы выбранный radio_button передавался в качестве choice_id, user_id и question_id брались из hidden_field'ов и все это записывалось в таблицу Responses ?

Можно напрямую -

@choice = params[:your_radio_button_name]
Response.create(:question_id => @question, :choice_id => @choice, :user_id => current_user )
, но лучше что-нибудь вроде current_user.answer(@question, @choice), э? где метод answer(question,choice) будет делать self.responses.create(:question_id => question, :choice_id => choice )

Я могу понять что по рельсам в интернете слишком много устаревшей инфы и глаза разбегаются, но http://guides.rubyonrails.org и документация на официальном сайте - лучшие места для первичного ознакомления, там все очень понятно и с примерами.

Модели кстати твои явно можно упростить, свести скажем до трех, но мне некогда думать, как оно лучше, извини.

volh ★★
()
Ответ на: комментарий от volh

да, устаревшей инфы очень много, всё по разным версиям рельс, несовместимых между собой...

current_user'а воспринимает как переменную или метод (которых не существует) и ругается.
да и в паре книг по рельсам,которые я читал, все-таки создавали сессии...

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

>current_user'а воспринимает как переменную или метод (которых не существует) и ругается.

Значит ты не используешь restful_authentication или еще какую-нибудь распостраненную систему аутентификации, или неправильно ее используешь.

да и в паре книг по рельсам,которые я читал, все-таки создавали сессии...


Их не создавали, сессии - часть рельсов, они уже есть, видимо просто тебе попадались куски, где с ними работали. В настоящих приложениях с последними стабильными версиями рельсов тебе почти никогда не нужно будет вручную возиться с сессиями, а если возникает такая необходимость ( как и с hidden_field ) - это может быть хорошим знаком, что ты делаешь что-то неправильно.

Я думаю дальше ты сам разберешься.

volh ★★
()
Ответ на: комментарий от volh

Уж надеюсь что разберусь =)
Спасибо большое за ответы!

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

а ты говоришь. вот не знаю чем, но чем-то задним когда просят туториал для решения конкретной задачи я чувствую, что стоит впарить учебник - проще будет

Unclown
()
Ответ на: комментарий от Unclown

Ну проще было бы почитать туториал для решения конкретной задачи... Но раз туториала нету - задаю общие вопросы. Уж всяко лучше, чем вообще никакой информации не получать.

kovrik ★★★★★
() автор топика
Ответ на: комментарий от kovrik

:) для статистики - ты давно с рельсами столкнулся?

Unclown
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.