我有6门不同的课程,我希望学生按难度对他们进行排名。 我正在查看number_field(并且只是让学生从该范围中分配一个数字)但是当我尝试它时,只有一些浏览器有上下箭头移动范围,而其他浏览器没有,并且它不是这是一个很好的解决方案,因为它只是提供了一个空白字段,学生可以在数据库需要整数时将文本放入
然后我开始查看API http://api.rubyonrails.org/classes/ActionView/Helpers/FormOptionsHelper.html#M001593
中的表单选项助手但是我无法弄清楚如何将它应用到我的情况中。我有一个学生模型,桌子上有6列 - :math,:science,:french,:english,:history,:geography - 当前设置为integer
type
有没有办法使用表单选项助手(如下面的api所示)并将其应用于我的要求,因此他们将类从1级排序到6级(最难以最简单等)?
Example with @post.person_id => 2:
select("post", "person_id", Person.all.collect {|p| [ p.name, p.id ] }, {:include_blank => 'None'})
could become:
<select name="post[person_id]">
<option value="">None</option>
<option value="1">David</option>
<option value="2" selected="selected">Sam</option>
<option value="3">Tobias</option>
</select>
答案 0 :(得分:1)
如果select
符合您的需求,
= form_for @student do |f|
= f.select :math, (1..10)
假设您希望数学按10级评分。我使用haml,但这并不重要。
修改(根据OP请求添加验证:)
class Student < ActiveRecord::Base
validates_with StudentValidator
end
class StudentValidator < ActiveModel::Validator
def validate(record)
courses = [:math, :science, :french, :english, :history, :geography]
courses.combination(2).each do |f,s|
f_value = record.send(f)
s_value = record.send(s)
if f_value == s_value
record.errors[:base] << "Two ranks can't be equal"
record.errors[f] << "can't be #{f_value}, #{s} is #{s_value}"
record.errors[s] << "can't be #{s_value}, #{f} is #{f_value}"
end
end
end
end
我考虑过添加客户端验证,但禁用选择选项在浏览器AFAIK中无效,因此您必须动态删除和添加选项。对于我来说,至少对于SO答案来说,看起来太过分了。遗憾。