我要做的是在轨道上制作一个基本的flashcard应用程序。此时,我正在寻找的是迭代一系列抽认卡的功能,对用户进行测验并让用户知道他们是否正确。在红宝石中,我写作并不需要花很长时间:
class Card
attr_accessor :answer, :question
def initialize(answer = "", question="")
@answer = answer
@question = question
end
def quiz
puts "What does #@question mean?"
answer = gets.chomp
if answer == @answer
puts "Right"
return true
else
puts "Wrong"
return answer
end
end
end
class Cardlist
attr_accessor :Cards
def initialize(Cards = [])
@Cards = Cards
end
def quiz
Cards.each do |w|
w.quiz
end
end
end
我在使用rails时遇到的问题是找出将逻辑循环到列表中所有卡的位置。我制作了这两个模型:
class Card < ActiveRecord::Base
belongs_to :cardlist
end
和
class Cardlist < ActiveRecord::Base
has_many :cards
end
我知道应用程序逻辑应该进入控制器,但如果我要为我的Cardlist控制器进行“测验”操作,我将如何让它遍历所有卡?在生成每个“测验”页面后,我需要从用户那里得到答案,回复(可能是闪存)是否正确,然后继续下一个问题。是否有任何逻辑必须进入视图以确保它将用户输入的答案发送回控制器?如何在不将数据写入数据库的情况下将信息发送回控制器?
答案 0 :(得分:2)
IMO,当用户启动测验时,CardList
实例被初始化并存储在会话中(您还可以为用户提供重启选项,这将是现有/另一个控制器上的另一种方法)。因此,CardList将坐在用户的会话中,并且您将在每个测验中给予他们另一个Card
。
因此,如果您愿意,您的“每个”方法会在网络点击之间进行划分。
因此,您的视图会向用户显示Card
,用户会在控制器上回答并点击该方法,然后将其移至下一个Card
并再次显示该视图。使用flash
变量是向用户提供有关前一次提交的反馈的好方法。
正如您所做的那样,您的卡通常是ActiveRecord模型。您也将CardList设为ActiveRecord模型,这是一个很好的方法。
请注意,您可能希望对quiz
和quiz
(例如QuizSet?)使用一些不同的术语,以使事情更加清晰。