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

選択ボックスに値を表示できますが、データはシリアル化されていません。代わりに、「役割を空白にすることはできません」という検証メッセージを受け取ります。

私のコントローラーの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

最終的に、私の質問は、モデルのハッシュを使用して選択ボックスにデータを入力し、選択ボックスの値をデータベースの従業員モデルの列に適切に保存するにはどうすればよいですか?

4

2 に答える 2

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

(ここでは:employeeは必要ないことに注意してください)

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

これで両方をしたくない場合:

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

<%= f.select :role, Employee::ROLES %>
于 2011-05-20T01:00:24.293 に答える
0

より簡潔に:

<%= f.select :role, Employee::ROLES.invert %>
于 2017-01-26T19:24:50.827 に答える