我需要向我的应用的所有用户显示一系列预设问题。使用Hartl“current_user”方法/会话控制器保护用户不会看到彼此的内容。我需要在任何应用用户中保留问题,并且只在session_controller后面保护他们的答案。
每个问题都有__答案,而answer_type可以是1.)布尔值,2。)自由文本字段(text_area),3。)整数,4。)日期时间,5。)枚举(已修复)响应值例如“好”,“坏”,“无关紧要”),6。)另一个模型对象/对象集合。
根据提供的答案,应用程序应将用户路由到下一个逻辑问题。我正在考虑使用state_machine来做这件事,但我认为这将是一个丑陋的代码混乱维护。
我有没有办法定义一个问题列表,硬编码answer_type(我知道每个问题前面会有哪个answer_type),并根据提供的答案定义哪个next_question? (例如,如果“是”路由到问题2,如果“否”路由到问题8)。
我发现以下内容似乎表明我可以在配置YAML文件中对问题进行硬编码:creating a pre-defined set of attributes for a Rails model
我认为我可以对存储在YAML文件中的信息数组做同样的事情 - 例如问题,answer_type,next_question_if_yes,next_question_if_no等编码到其中。
我是否有另一种方法可以将问题分配到Rails应用程序中,其中每个注册该应用程序的帐户都会预先配置相同的问题,这些问题的路径将由用户答案确定?
答案 0 :(得分:1)
您尝试创建的是某种状态机。想象一下每个问题如何导致下一个问题的流程图。
有很多方法可以做到这一点,但实际上会发生的事情是您的控制器评估当前用户所处的流程的哪个阶段,然后根据该信息显示下一个数据。
根据当前问题的答案,您的YAML文件将成为下一个问题的ID的来源。
例如,在YAML中给出以下问题树:
$http({method: 'GET', url: '/someUrl'}).
success(function(data, status, headers, config) {
var anchor = angular.element('<a/>');
anchor.attr({
href: 'data:attachment/csv;charset=utf-8,' + encodeURI(data),
target: '_blank',
download: 'filename.csv'
})[0].click();
}).
error(function(data, status, headers, config) {
// if there's an error you should see it here
});
然后假设您的YAML被加载到名为# config/initializers/questions.yml
questions:
- id: 1
question_text: "What is 1+1?"
answers:
- answer_text: "2"
next_question_id: 3
- answer_text: "3"
next_question_id: 2
- id: 2
question_text: "Did you fail math class?"
answers:
- answer_text: "yes"
next_question_id: 3
- answer_text: "no"
next_question_id: 1
- id: 3
question_text: "Who was the first President of the US?"
answers:
- answer_text: "George Washington"
next_question_id: 4
- answer_text: "Santa Claus"
next_question_id: 3
的哈希中,如果您有一个问题控制器,其中问题的答案已提交给名为QUESTIONS_HASH
的方法:
submit_answer