Показать один кусок многомерного массива при вводе другого из формы?
Мне нужно иметь возможность ввести строковое значение, и он должен ввести идентификатор этой строки в таблице.
Я пытаюсь получить что-то вроде select
отметить в HTML
работать в Ruby
, Однако мне нужно, чтобы он программно изменялся при добавлении новых строк в таблицу, из которой я извлекаю значения.
Сама таблица выглядит примерно так:
Locations
id location_cd
| 1 | SLC|
| 2 | LAS|
и т.п.
Я использовал класс Location для передачи этих значений из этой таблицы в массив. Вот класс Location.
class Location < ActiveRecord::Base
def self.select_options
self.all.sorted.collect{ |q| [q.id, q.location_cd]}
end
end
Это дает мне этот многомерный массив, когда я вызываю метод select_options.
[[1, "SLC"], [2, "LAS"]]
Вот что у меня в контроллере.
def edit
@pallet = Pallet.find(params[:id])
@locations = Location.all
end
def update
@pallet = Pallet.find(params[:id])
if @pallet.update_attributes(pallet_params)
flash[:notice] = "Pallet Updated Successfully."
redirect_to(:action => 'show', :id => @pallet.id)
else
@pallet_count = Pallet.count
render('edit')
end
end
Поддон - это основной класс, из которого я тяну, и мне нужно ввести location.id в таблицу поддонов.
Вот что у меня есть в редактировании.
<%= link_to("<< Back to List", {:action => 'index'}, :class => 'back-link') %>
<div class="pallets edit">
<h2>Update Pallet</h2>
<%= form_for(:pallet, :url => {:action => 'update', :id => @pallet.id}) do |f| %>
<%= render(:partial => "form", :locals => {:f => f}) %>
<div class="form-buttons">
<%= submit_tag("Update Pallet") %>
</div>
<% end %>
</div>
Это перенаправит его в форму, и вот что у меня есть в моей форме. Вот где я сталкиваюсь с проблемой.
<table summary="Pallets from fields">
<tr>
<th><%= f.label(:destination) %></th>
</tr>
<tr>
<td><%= f.select(:destination, Location.select_options) %></td>
</tr>
</table>
Это даст мне список id
вот так.
1
2
Однако я хочу список location_cd
вот так.
SLC
LAS
Но мне нужно, чтобы это было до того момента, когда я смогу ввести SLC, а в базе данных вместо него введите 1.
Чтобы положить это в перспективе multidimensional array
Мне нужно иметь возможность ввести второе значение [[1, "SLC"]]
на стороне пользователя, и первое значение (1
) следует занести в таблицу.
1 ответ
Я много копал и смог найти то, что сработало.
Есть помощник, который идет с рельсами, названными options_for_select()
, Что это делает, это займет что-то вроде этого
<%= select_tag(:destination, '<option value="1">SLC</option>...') %>
И он будет автоматически генерировать параметры, используя multidimensional array
Так как у меня уже был multidimensional array
используя select_options
Метод, я смог использовать их в сочетании друг с другом, например, так:
<td><%= select_tag(:destination, options_for_select(Location.select_options)) %></td>
Это вытягивает именно то, что мне было нужно, и добавляет правильное значение в базу данных при выборе.
Другой метод - без помощника options_for_select, но для него должен быть доступен параметр, для которого выбрана строка.
@pallet = Pallet.find(2)
<td><%= select(:pallet, :destination, Location.select_options) %></td>
Преимущество этого в том, что оно автоматически по умолчанию соответствует тому, что уже было. Это облегчает, когда вы обновляете то, что не является местоположением.