2011-05-19 35 views
3

我正在嘗試爲包含從哈希集合中填充的選擇框的模型設置表單。如何用散列填充選擇標記並將值正確保存到數據庫?

具體來說,我的員工模式有作用的哈希:

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

和驗證程序:

validates_presence_of :role 

理想情況下,我想用這個信息來填充選擇框的形式。例如:

<%= form_for @employee do |f| %> 
    <%= label_tag :role, "Role" %> 
    <%= f.select :employee, :role, Employee::ROLES %> 
<% end %> 

儘管我可以在選擇框中顯示值,但數據不會被序列化。相反,我收到驗證消息「角色不能爲空」。

我控制器的創建方法是這樣的:

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 

最後,我的問題是我如何使用模型中的散列和正確的選擇框的值保存到列上填充選擇框數據庫中的員工模型?

+0

應該有一個Array – apneadiving 2011-05-19 21:42:11

+0

做什麼是選擇標籤的生成的輸出? – 2011-05-19 21:54:11

+0

Tom 2011-05-19 22:49:04

回答

8

如果你遵循的建議,使用一個數組來存儲你的角色這將是更容易,但你不必...我們可以只是把它轉換成一個陣列在渲染時

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

puts ROLES.map{|r| [ r[0], r[1] ]} 
=> [[1, "Lead"], [2, "Engineer"], [3, "Intern"]] 

select_tag需要一個[Name,id](Person.all.collect {| p | [p.name,p.id]})的數組

(請注意,您不希望:員工在這裏)

<%= f.select :role, Employee::ROLES.map{|role| [ role[1], role[0] ]} %> 

如果你不想這兩個:

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

<%= f.select :role, Employee::ROLES %> 
+0

我很好用數組 - 不意味着暗示我強烈追求使用的散列。但是,感謝這:)。 – Tom 2011-05-20 11:16:06

0

更簡潔:

<%= f.select :role, Employee::ROLES.invert %> 
相關問題