2012-01-17 42 views
3

但愿这不是太复杂了..如何填充使用索引的rails 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阵列的正确索引?

更新:去重新设计这使枚举-ED attribs实际AD对象

回答

0

决定执行散列代替阵列的这个常数,这提供一个模型的简单而不复杂处理索引..我将存储哈希键并仅在视图中使用这些值。

Whee !!

+0

你可以发布你最终使用的代码吗? – ardochhigh 2013-07-06 15:04:02

+0

当然:https://gist.github.com/mbhnyc/5944282 – MBHNYC 2013-07-07 17:43:30

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

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

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]} %> 

这将输出很好用select值作为哈希键选择,选择名称为哈希值,比如:现在

<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

显示它在视图中为“校园招聘 - CSO”你会在模型中自己创建一个小的返回功能,像这样:

def return_paper_type 
    HASH_NAME[id] 
    end 

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

+0

我在哪里添加第一个哈希?在模型文件中? – Cybergenie 2015-02-04 13:16:34

+1

@Cyber​​genie是的,你必须在模型文件中添加散列。 – 2015-02-04 13:18:00

+0

感谢您的快速回复兄弟。我会发布我的结果,并喜欢upvote如果它的答案现在:) – Cybergenie 2015-02-04 13:19:02