Показать один кусок многомерного массива при вводе другого из формы?

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

Я пытаюсь получить что-то вроде 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>

Преимущество этого в том, что оно автоматически по умолчанию соответствует тому, что уже было. Это облегчает, когда вы обновляете то, что не является местоположением.

Другие вопросы по тегам