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

182

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

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

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

totocaster
источник
Я не уверен, хотите ли вы, чтобы проект по умолчанию был выбран при загрузке страницы, если: project_id не установлен или если вы хотите вернуть значение select в хэше params как: pid.
Tilendor

Ответы:

223

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

<%= f.select :project_id, @project_select, :selected => params[:pid] %>
htanata
источник
5
без параметров, options_for_selectэто лучший способ. Это хорошо для любой ситуации, хорошо для редактирования формы тоже.
Адриано Резенди
Вот КЛЮЧ: СМОТРИТЕ на свою функцию (options_for_select () против f.select. Помните, что это разные функции.
FlyingV
126

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

<%= f.select :project_id, options_for_select(..., @work.project_id) %>
рысь
источник
4
Это лучший ответ, потому что он select_tagтоже работает . Спасибо, это действительно помогло мне тоже.
stephenmurdoch
7
Также вы можете попробоватьoptions_for_select(..., f.object.project_id )
18augst
Спасибо! Все остальные принятые ответы не говорят, как выбрать через переменную.
Майк Белэнджер
52

Rails 3.0.9

select options_for_select([value1, value2, value3], default)
Cheng
источник
Я не мог понять это решение, пока не заметил закрывающую скобку вокруг массива значений ДО запятой, которая разделяет ваше значение по умолчанию ... Я пропустил эту скобку здесьvalue3], default
BigRon
33

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

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

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

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

Майк Бетани
источник
3
Это чистое решение, и, как уже упоминалось, вы хотите установить значение по умолчанию только для нового и текущее значение для редактирования.
считать
1
Я знаю, что это старая тема, но для тех, кто может столкнуться с этим, этот ответ также работает с select2плагином JS. Прекрасно работает, если вы создаете или редактируете записи с той же формой и используете select2, особенно с заполнителем текста.
cdouble.bhuck
Я думаю, что это должен быть тот, который принят в качестве Ответа, как @Mike Bethany сказал, что все остальные ответы, несмотря на то, что форма отображается только для новых записей, когда подход rails заключается в повторном использовании формы. Слава Майк
Эрик Кастрильо
22

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

    <%= f.select :project_id, @project_select, :selected => f.object.project_id %>
Гавит
источник
Использование Rails 4 params[:pid]не сработало, но ваш пример сработал.
Эрик Ванчич
Это сработало для меня, так как я использую частичное внутри "f.fields_for" Спасибо.
Хьюго
11

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

params[:pid].to_i  

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

danengle
источник
Этот ответ помог мне точно определить мою проблему. Мой блок выбора является динамическим и извлекает коллекцию из базы данных. Я пытался заполнить выбор по умолчанию заголовком, а не идентификатором элемента. Этот ответ помог мне увидеть эту проблему, и как только я наполнил свою @projectпеременную идентификатором из таблицы базы данных, а не заголовком, этот код работал с добавлением на заднюю часть form.selectпомощника: selected: @projectСпасибо, @danengle
Кристофер Уоррингтон,
10

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

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

@work.project_id = params[:pid] unless params[:pid].nil?
totocaster
источник
7
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
jschorr
источник
3

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

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

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

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
Shelvacu
источник
2
<%= f.select :project_id, options_from_collection_for_select(@project_select,) %>
swapnilp
источник
0

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

promacuser
источник
0

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

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

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

:selected => f.object.your_field 
user2480972
источник
0

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

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

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, тогда первое значение будет выбрано, иначе second.

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' %>
Шива Кумар
источник
0

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

  <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
random_user_0891
источник
-2

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

<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>
epochwolf
источник
но он не выберет соответствующий элемент в выбранном: S
totocaster