Передача одной записи из объекта модели ActiveRecord в параметр (или как передать несколько полей в параметре)? - PullRequest
0 голосов
/ 07 марта 2011

Рельсы 2.3.5

У меня есть представление, отображающее записи «сотрудник» в таблице, где каждая строка таблицы имеет check_box_tag для выбора этой (строки) записи сотрудника (таблица находится внутри form_tag). Флажок передает массив номеров служащих методу, но мне также нужно, чтобы он передавал некоторую другую информацию из записи (имя_символа, фамилия и т. Д.) В параметрах.

Вначале это выглядело как (просто передавая параметр с массивом номеров сотрудников)

<% @employee_search.each do |e| %>
 <td><%= check_box_tag 'selected_subordinates[]', e.employee_number %></td>
 <td><%= e.employee_number %></td>
 <td><%= e.first_name %></td>
 <td><%= e.last_name %></td>
 ...
<% end %>

Я не уверен, что это было правильно, но я подумал, что должен передать всю запись ('e') в параметре:

<% @employee_search.each do |e %>
 <td><%= check_box_tag 'selected_subordinates[]', e %></td>
 <td><%= e.employee_number %></td>
 <td><%= e.first_name %></td>
 <td><%= e.last_name %></td>
 ...
<% end %>

Массив параметров теперь выглядит так:

"selected_subordinates"=>["#<Employee:0xa946970>", "#<Employee:0xa946910>", "#<Employee:0xa9468b0>"]

В этот момент я думал, что все будет в порядке, и я просто прохожу через объекты в массиве параметров, ссылаясь на поля записи, но получил неопределенную ошибку метода:

params[:selected_subordinates].each do |s|
  puts s.last_name
end

undefined method `last_name' for "#<Employee:0xa946970>":String

Я начал задаваться вопросом, был ли по какой-то причине весь объект модели передан вместо одной записи из объекта. Но попытка [0] .last_name привела к другой ошибке.

params[:selected_subordinates].each do |s|
  puts s.last_name
end

undefined method `last_name' for 35:Fixnum

Может быть, мне следовало бы использовать поля, которые мне нужны для создания массива для параметра - таким образом, этот параметр был бы массивом массивов? До сих пор мне не повезло, когда я пытался найти пример того, что делать, когда вам нужно настроить массив параметров из массивов или передать одну запись объекта модели (и обратиться к ней).

Спасибо - высоко ценится!

1 Ответ

1 голос
/ 07 марта 2011

Когда вы использовали e в качестве параметра, Rails преобразовывал e в строку и передавал ее (вы не можете передать объект в форме HTML, верно? Только значения). Когда вы увидели "#<Employee:0xa946970>" в хэше params, это был не объект Employee, а String с содержимым #<Employee:0xa946970> (это то, что вы получаете, если вы вызываете .to_s для объекта Employee).

Передача идентификатора приводит вас на правильный путь, но как только вы получите идентификатор, вы должны найти сотрудника с этим идентификатором в базе данных.

params[:selected_subordinates].each do |s|
  employee = Employee.find(s)
  puts employee.last_name
end

Конечно, это загружает их по одному, поэтому, если у вас много флажков, вы можете сгенерировать большое количество запросов. Вы также можете использовать метод find, чтобы найти несколько объектов на основе массива идентификаторов:

employees = Employee.find(params[:selected_subordinates])
employees.each do |e|
  puts e.last_name
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...