Довідник вибору рейки - як вибране значення за замовчуванням, як?


182

Ось фрагмент коду, який я зараз використовую:

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

Як змінити його, щоб його значення за замовчуванням було рівним params[:pid]при завантаженні сторінки?


Я не впевнений, чи потрібно вибрати проект за замовчуванням, вибраний під час завантаження сторінки, якщо: project_id не встановлено, або якщо ви хочете повернути значення вибору в параметрі хеш як: pid.
Тилендор

Відповіді:


223

Це слід зробити:

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

5
без парам, options_for_selectкращий спосіб. Це добре для будь-якої ситуації, добре і для редагування форми.
Адріано Ресенде

Ось КЛЮЧ: ПОВЕРНІТЬСЯ на свою функцію (options_for_select () vs 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

Рейки 3.0.9

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

Я не зміг розібратися в цьому рішенні, поки я не помітив вашу закриваючу дужку навколо масиву значень ПЕРЕД комою, яка відокремлює ваше значення за замовчуванням ... Я пропустив цю дужку тутvalue3], default
BigRon

33

Проблема з усіма цими відповідями полягає в тому, що вони встановлюють поле за замовчуванням, навіть якщо ви намагаєтесь редагувати свій запис.

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

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

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


3
Це чисте рішення, і як уже згадувалося, ви хочете встановити значення за замовчуванням лише на нове та поточне значення для редагування.
count0

1
Я знаю, що це стара тема, але для тих, хто може на неї натрапити, ця відповідь також працює із select2плагіном JS. Чудово працює, якщо ви створюєте чи редагуєте записи в одній формі та використовуєте select2, особливо з текстом-заповнювачем.
cdouble.bhuck

Я думаю, що це має бути той, який прийнято як відповідь, як @Mike Bethany сказав, що всі інші відповіді, оскільки форма подається лише для нових записів, коли підхід рейлів - це повторне використання форми. Kudos Mike
Erick Castrillo

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  

щоб у списку вибору вибрати потрібний елемент


Ця відповідь допомогла мені точно визначити мою проблему. Мій вікно вибору є динамічним і витягує колекцію з бази даних. Я намагався заповнити вибір за замовчуванням заголовком, а не ідентифікатором елемента. Ця відповідь допомогла мені побачити цю проблему, і як тільки я заповнив свою @projectзмінну ідентифікатором із таблиці бази даних, замість заголовка, цей код працював, доданий на зворотній стороні form.selectпомічника: selected: @projectДякую @danengle
Крістофер Уоррінгтон

10

Я знайшов рішення, і я виявив, що я досить недосвідчений в RoR.

Всередині контролера, який керує поданим вище описом, додайте це:

@work.project_id = params[:pid] unless params[:pid].nil?


3

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

вибрано - Булевий атрибут вказує на те, що певний варіант може бути спочатку обраний.

Це означає, що код повинен виглядати так:

f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}


0

Крім того, ви можете встановити атрибут: project_id у контролері, оскільки перший аргумент f.select тягне саме цей атрибут.


0

Якщо спробувати надрукувати об'єкт f, то ви побачите, що є f.object, який можна перевірити для отримання вибраного елемента (застосовно до всіх версій рейки> 2.3)

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

тому використовуйте наступний скрипт, щоб отримати правильний вибраний варіант:

:selected => f.object.your_field 

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>

Отже, щоб зробити параметр обраний за замовчуванням, ми повинні використовувати 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' %>

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

-2

Це має працювати для вас. Він просто переходить {:value => params[:pid] }до змінної html_options.

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

але він не вибере відповідний елемент у виборі: S
tocacaster
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.