如何使用哈希填充选择标记并将值正确保存到数据库?

Tom*_*Tom 3 hash select ruby-on-rails form-helpers

我正在尝试为包含从散列中的集合填充的选择框的模型设置表单.

具体来说,我的员工模型有一个角色哈希:

ROLES = {1 => "Lead", 2 => "Engineer", 3 => "Intern" }
Run Code Online (Sandbox Code Playgroud)

还有一个验证器:

validates_presence_of :role
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想使用此信息填充表单中的选择框.像这样的东西:

<%= form_for @employee do |f| %>
    <%= label_tag :role, "Role" %>
    <%= f.select :employee, :role, Employee::ROLES %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

虽然我可以在选择框中显示值,但数据不是序列化的.相反,我收到"角色不能为空"的验证消息.

我的控制器的create方法如下所示:

def create
  @employee = Employee.new(params[:employee])
  if @employee.save
    redirect_to employees_path, :notice => "Successfully created a new employee."
  else
    render :action => 'new'
  end
end
Run Code Online (Sandbox Code Playgroud)

最后,我的问题是如何使用模型中的哈希填充选择框并将选择框的值正确保存到数据库中员工模型的列中?

Jes*_*ott 8

如果您遵循建议并使用数组来存储角色会更容易,但您不必...我们可以在渲染时将其转换为数组

ROLES = {1 => "Lead", 2 => "Engineer", 3 => "Intern" }

puts ROLES.map{|r| [ r[0], r[1] ]}
=> [[1, "Lead"], [2, "Engineer"], [3, "Intern"]]
Run Code Online (Sandbox Code Playgroud)

select_tag需要一个[Name,id]数组(Person.all.collect {| p | [p.name,p.id]})

(注意你不想要:员工在这里)

<%= f.select :role, Employee::ROLES.map{|role| [ role[1], role[0] ]} %>
Run Code Online (Sandbox Code Playgroud)

如果你不想同时使用这个:

ROLES = ["Lead", "Engineer", "Intern"]

<%= f.select :role, Employee::ROLES %>
Run Code Online (Sandbox Code Playgroud)