2017-10-19 42 views
0

如何从散列enum创建form_for复选框:Rails的形成与枚举(散)复选框

class UserProfile < ApplicationRecord 
    enum locations: { Kursenai: 0, Papiskes: 1, Versiai: 2 } 

我尝试类似:

<div class="field"> 
    <% UserProfile.locations.map { |k, v| }.each do |key, val| %> 
    <%= f.label key %><br /> 
    <%= f.check_box :locations, {:multiple => true}, val, nil %> 
    <% end %> 
</div> 

但这种失败在许多方面,对前。我想我可以从循环抢key,并将其设置为标签的价值。我Postgres有:

t.integer "locations", array: true 

我还允许locations强PARAMS:

..permit(:locations) 

是否应当做其他的东西在数据库中保存数组?

另请咨询此 - 现在enum被放置在一个模型中,但我也将其用于其他类,所以我应该创建它作为一个concern或只是作为一个简单的类?

在此先感谢

编辑:

我在控制台下:

p = { Kursenai: 0, Papiskes: 1, Versiai: 2 } 
p.map{|k,v| [k, v]}.each do |key, val| puts key, val 

我也得到:

Kursenai 
0 
Papiskes 
1 
Versiai 
2 
=> [[: Kursenai, 0], [: Papiskes, 1], [: Versiai, 2]] 

而且在模板中,第一个复选框出现没有一个复选框(只是标签),而最后没有标签。嗯...

+0

oops,愚蠢的错误 - 'map'不返回任何内容:D更好地返回一些东西:) - 'UserProfile.locations.map {| k,v | [k,v]}'。但是这仍然无法按预期工作 - 最后一个复选框的标签显示完整的枚举,而不是其中的一个项目的关键。请随时写一个更好的执行这个 –

+0

噢......不可以belevae这个..我有'
'放在那里...为我的家人耻辱... –

回答

1

您有不必要的呼叫map ..哈希值已经产生[键,值]对,而中列举过的元素,所以你就应该能够做到这一点:

<% UserProfile.locations.each do |key, val| %> 
    ... 
<% end %> 

此外,看起来您正尝试使用enum列同时存储多个值,但是,我认为enum列帮助程序设计为围绕单数值的包装,因此表单字段应该可能是单选按钮或一个select菜单,而不是复选框。

+0

关于地图的好点。这是解决以前的错误的结果。而我使用枚举,因为我使用相同的项目选择领域:)谢谢! –