Rails select helper - По умолчанию выбрано значение, как?

Вот фрагмент кода, который я сейчас использую:

<%= f.select :project_id, @project_select %>

Как изменить его, чтобы сделать его значение по умолчанию равным params[:pid] когда страница загружается?

14 ответов

Решение

Это должно сделать это:

<%= f.select :project_id, @project_select, :selected => params[:pid] %>

Используйте правильный атрибут текущего экземпляра (например, @work.project_id):

<%= f.select :project_id, options_for_select(..., @work.project_id) %>

Rails 3.0.9

select options_for_select([value1, value2, value3], default)

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

Вам нужно установить значение по умолчанию для вашего существующего значения, а затем установить его в качестве фактического значения по умолчанию, только если у вас нет значения. Вот так:

f.select :field, options_for_select(value_array, f.object.field || default_value)

Для тех, кто не знаком с f.object.field ты всегда используешь f.object затем добавьте имя вашего поля в конце этого.

Попробуй это:

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>

Если params[:pid] - строка, которая, если она пришла из формы, вероятно, вам понадобится

params[:pid].to_i  

для правильного пункта, который будет выбран в списке выбора

Я нашел решение, и я обнаружил, что я довольно неопытный в RoR.

Внутри контроллера, который управляет представлением, описанным выше, добавьте это:

@work.project_id = params[:pid] unless params[:pid].nil?
<%= f.select :project_id, @project_select, :selected => params[:pid] %>

Я не мог заставить это работать и обнаружил, что мне нужно добавить "выбранный" атрибут html не только к правильному <option> тег, но и к <select> тег. Документы MDN по выбранному атрибуту тега выбора говорят:

selected - логический атрибут указывает, что конкретная опция может быть изначально выбрана.

Это означает, что код должен выглядеть так:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>

Его уже объяснили, попробую привести пример

пусть список выбора будет

select_list = { eligible: 1, ineligible: 0 }

Таким образом, следующий код приводит к

<%= f.select :to_vote, select_list %>

<select name="to_vote" id="to_vote">
  <option value="1">eligible</option>
  <option value="0">ineligible</option>
</select>

Поэтому, чтобы сделать опцию выбранной по умолчанию, мы должны использовать selected: значение.

<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>

если can_vote? возвращает true, он устанавливает selected: 1, тогда будет выбрано первое значение, а второе.

select name="driver[bca_aw_eligible]" id="driver_bca_aw_eligible">
  <option value="1">eligible</option>
  <option selected="selected" value="0">ineligible</option>
</select>

если параметры выбора - это просто список массива, а не hast, то выбранным будет только значение, которое будет выбрано, например, если

select_list = [ 'eligible', 'ineligible' ]

Теперь выбранный просто возьмет

<%= f.select :to_vote, select_list, selected: 'ineligible' %>

Ответ Майка Бетани выше работал, чтобы установить значение по умолчанию при создании новой записи и по-прежнему иметь значение, выбранное пользователем, которое отображается в форме редактирования. Однако я добавил проверку модели, и это не позволило мне отправить форму. Вот что у меня сработало, чтобы проверить модель в поле и показать значение по умолчанию, а также значение, выбранное пользователем в режиме редактирования.

  <div class="field">
    <%= f.label :project_id, 'my project id', class: "control-label" %><br>
    <% if @work.new_record? %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], true), {}, required: true, class: "form-control" %><br>
    <% else %>
      <%= f.select :project_id, options_for_select([['Yes', true], ['No', false]], @work.project_id), {}, required: true, class: "form-control" %><br>
    <% end %>
  </div>

проверка модели

  validates :project_id, presence: true

В качестве альтернативы, вы можете установить атрибут:project_id в контроллере, так как первый аргумент f.select извлекает этот конкретный атрибут.

Если попытаться напечатать объект f, то вы увидите, что существует объект f.object, который можно проверить для получения выбранного элемента (применимо для всех версий rails> 2.3)

logger.warn("f #{f.object.inspect}")

Итак, используйте следующий скрипт, чтобы получить правильную выбранную опцию:

:selected => f.object.your_field 

Это должно работать для вас. Это просто проходит {:value => params[:pid] } в переменную html_options.

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>
Другие вопросы по тегам