Ось фрагмент коду, який я зараз використовую:
<%= f.select :project_id, @project_select %>
Як змінити його, щоб його значення за замовчуванням було рівним params[:pid]
при завантаженні сторінки?
Ось фрагмент коду, який я зараз використовую:
<%= f.select :project_id, @project_select %>
Як змінити його, щоб його значення за замовчуванням було рівним params[:pid]
при завантаженні сторінки?
Відповіді:
Це слід зробити:
<%= f.select :project_id, @project_select, :selected => params[:pid] %>
options_for_select
кращий спосіб. Це добре для будь-якої ситуації, добре і для редагування форми.
Використовуйте правильний атрибут поточного екземпляра (наприклад @work.project_id
):
<%= f.select :project_id, options_for_select(..., @work.project_id) %>
select_tag
теж працює . Дякую, що це дуже допомогло і мені.
options_for_select(..., f.object.project_id )
Рейки 3.0.9
select options_for_select([value1, value2, value3], default)
value3], default
Проблема з усіма цими відповідями полягає в тому, що вони встановлюють поле за замовчуванням, навіть якщо ви намагаєтесь редагувати свій запис.
Ви повинні встановити за замовчуванням до існуючого значенням , а потім тільки встановити його на фактичне значення по замовчуванням , якщо не має значення. Так:
f.select :field, options_for_select(value_array, f.object.field || default_value)
Для тих, хто не знайомий з f.object.field
вами, завжди використовуйте, f.object
а потім додайте назву поля в кінці цього.
select2
плагіном JS. Чудово працює, якщо ви створюєте чи редагуєте записи в одній формі та використовуєте select2, особливо з текстом-заповнювачем.
Спробуйте це:
<%= f.select :project_id, @project_select, :selected => f.object.project_id %>
params[:pid]
не вийшло, але ваш приклад так і зробив.
якщо params [: pid] - це рядок, який, якщо він вийшов із форми, він є, ймовірно, вам доведеться використовувати
params[:pid].to_i
щоб у списку вибору вибрати потрібний елемент
@project
змінну ідентифікатором із таблиці бази даних, замість заголовка, цей код працював, доданий на зворотній стороні form.select
помічника: selected: @project
Дякую @danengle
Я знайшов рішення, і я виявив, що я досить недосвідчений в RoR.
Всередині контролера, який керує поданим вище описом, додайте це:
@work.project_id = params[:pid] unless params[:pid].nil?
Я не зміг зробити це спрацьованим і виявив, що мені потрібно додати "вибраний" html атрибут не тільки до правильного <option>
тегу, але й до <select>
тегу. Документи MDN про вибраний атрибут тегу select кажуть:
вибрано - Булевий атрибут вказує на те, що певний варіант може бути спочатку обраний.
Це означає, що код повинен виглядати так:
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
Крім того, ви можете встановити атрибут: project_id у контролері, оскільки перший аргумент f.select тягне саме цей атрибут.
Якщо спробувати надрукувати об'єкт f, то ви побачите, що є f.object, який можна перевірити для отримання вибраного елемента (застосовно до всіх версій рейки> 2.3)
logger.warn("f #{f.object.inspect}")
тому використовуйте наступний скрипт, щоб отримати правильний вибраний варіант:
:selected => f.object.your_field
Його вже пояснили, спробую навести приклад
нехай список вибору буде
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>
Отже, щоб зробити параметр обраний за замовчуванням, ми повинні використовувати select: value .
<%= f.select :to_vote, select_list, selected: select_list.can_vote? ? 1 : 0 %>
якщо can_vote? повертає значення true, яке встановлює вибраним: 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>
якщо параметри вибору є лише списком масиву, а не поспіхом, то вибраним буде лише значення, яке вибирається, наприклад, якщо
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
Це має працювати для вас. Він просто переходить {:value => params[:pid] }
до змінної html_options.
<%= f.select :project_id, @project_select, {}, {:value => params[:pid] } %>