我应该使用哪些导轨来帮助人们对事物进行排名?

时间:2011-12-02 07:32:46

标签: ruby-on-rails

我有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>

1 个答案:

答案 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答案来说,看起来太过分了。遗憾。