Как заполнить тег select хешем и правильно сохранить значение в базе данных? - PullRequest
3 голосов
/ 20 мая 2011

Я пытаюсь настроить форму для модели, которая содержит поле выбора, заполненное из коллекции в хэше.

В частности, моя модель сотрудника имеет хэш ролей:

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

В конечном счете, мой вопрос заключается в том, как заполнить поле выбора с использованием хеш-функции в модели и правильно сохранить значение поля выбора в столбце модели сотрудника в базе данных?

Ответы [ 2 ]

8 голосов
/ 20 мая 2011

Будет проще, если вы будете следовать совету и использовать массив для хранения своих ролей, но вам не нужно ... Мы можем просто преобразовать его в массив во время рендеринга

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 голосов
/ 26 января 2017

Более кратко:

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