如何使用索引填充rails simple_form选择框?

时间:2012-01-17 18:59:48

标签: ruby-on-rails-3 simple-form

希望这不是太复杂。

所以我有一个有很多属性的模型,我决定将它作为索引存储在数据库中,引用模型中的常量:

class Profile < ActiveRecord::Base
   STATUS_CHOICES = %w( single relationship married divorced complicated open )
   etc...

在我的表格中,我现在正在这样做:

= f.simple_fields_for :profile do |p|
  = dp.input :relationship_status, :required => true, :collection => Datingprofile::STATUS_CHOICES

这很好地显示了集合,但当然,需要根据模型中的索引设置值。如何将集合上的值设置为与STATUS_CHOICES数组的正确索引相对应?

更新:重新设计这个以使枚举属于实际的AD对象

4 个答案:

答案 0 :(得分:6)

<强>模型

某种常量哈希:

HASH_NAME = {
 0 => "Choose:",
1 => "On-Campus Recruiting - CSO",·
2 => "CSO Staff Referral",
3 => "Faculty Contact",·
4 => "Career Day",·
5 => "CSO Summer Job Listing",·
6 => "Alumni Contact",·
7 => "Personal Contact",·
8 => "Other"·
}

- 查看

<%= f.input :some_field, :collection => Model::HASH_NAME.sort.map {|k,v| [v,k]} %>

这将输出nice select,select-value作为hash key,select-name作为hash值,例如:

<select id="form_application_job_source" class="select required" name="form_application[job_source]">
<option value="0">Choose:</option>
<option value="1">On-Campus Recruiting - CSO</option>
<option value="2">CSO Staff Referral</option>
<option value="3">Faculty Contact</option>
<option value="4">Career Day</option>
<option value="5">CSO Summer Job Listing</option>
<option value="6">Alumni Contact</option>
<option selected="selected" value="7">Personal Contact</option>
<option value="8">Other</option>
</select>

现在,如果您从下拉列表中选择“校园招聘 - CSO”,则存储的值为:1

要在视图中将其显示为“On-Campus Recruiting - CSO”,您必须在模型中创建一个小返回函数:

def return_paper_type
    HASH_NAME[id]
  end

在视图中,它会是这样的:<%= @instancevariable.return_paper_type %>

答案 1 :(得分:2)

快速解决此问题的一种方法是使集合成为选项元素值的枚举索引,然后使用STATUS_CHOICES数组来获取标签:label_method。

= f.simple_fields_for :profile do |p|
  = dp.input :relationship_status, :required => true, :collection =>  0..Datingprofile::STATUS_CHOICES.length, :label_method => lambda { |i| Datingprofile::STATUS_CHOICES[i] }

参考文献:

https://github.com/plataformatec/simple_form#collections https://github.com/plataformatec/simple_form/blob/master/test/inputs/collection_select_input_test.rb#L141

答案 2 :(得分:0)

决定实现哈希而不是数组的这个常量,这提供了一个模型的简单性而没有处理索引的复杂性。我将存储哈希键并仅在视图中使用这些值。

Whee !!

答案 3 :(得分:0)

将此行添加到应用程序的Gemfile:

gem 'enum_help'

然后执行:

$ bundle

在模型中

class Profile < ActiveRecord::Base
   enum relationship_status:{single: 0,relationship:1, married:2, divorced:3, complicated:4, open:5}
   etc...

在_form.html.erb中使用simple_form:

<%= f.input :relationship_status %>

有关详细信息:https://github.com/zmbacker/enum_help