Вот фрагмент кода, который я сейчас использую:
<%= 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 )
Проблема со всеми этими ответами состоит в том, что они устанавливают в поле значение по умолчанию, даже если вы пытаетесь редактировать свою запись.
Вы должны установить по умолчанию к существующему значению , а затем только установить его на фактическое значение по умолчанию , если не имеет значения. Вот так:
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?
Я не смог заставить это работать и обнаружил, что мне нужно добавить атрибут «selected» html не только в правильный <option>тег, но и в <select>тег. Документы MDN по выбранному атрибуту тега select говорят:
selected - логический атрибут указывает, что конкретная опция может быть изначально выбрана.
Это означает, что код должен выглядеть так:
f.select :project_id, options_for_select(@project_select, default_val), html: {selected: true}
В качестве альтернативы, вы можете установить атрибут: project_id в контроллере, так как первый аргумент f.select извлекает этот конкретный атрибут.
Если попытаться напечатать объект f, то вы увидите, что существует объект f.object, который можно проверить для получения выбранного элемента (применимо для всех версий rails> 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>
Поэтому, чтобы сделать опцию выбранной по умолчанию, мы должны использовать 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' %>
Ответ Майка Бетани, приведенный выше, работал, чтобы установить значение по умолчанию, когда создавалась новая запись, и все еще иметь значение, выбранное пользователем, отображаемое в форме редактирования. Однако я добавил проверку модели, и она не позволила мне отправить форму. Вот что помогло мне проверить модель на поле и показать значение по умолчанию, а также значение, выбранное пользователем в режиме редактирования.
<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] } %>