#ruby-on-rails
#ruby-on-rails
Вопрос:
Я хотел бы создать простой выпадающий список со статическими значениями, который я мог бы повторно использовать в любом месте моего приложения Ruby on Rails в форме. Выпадающий список действительно прост, что-то вроде этого:
<select>
<option value="5">5 minutes</option>
<option value="15">15 minutes</option>
<option value="30">30 minutes</option>
<option value="60">1 hour</option>
</select>
Каков наиболее удобный способ в Rails создать «элемент управления» (я не знаю, используется ли этот термин вообще в Rails), подобный этому, и иметь возможность использовать его в любом месте формы и привязать его к свойству класса модели?
ОБНОВЛЕНИЕ: Спасибо за ответы, кажется, это действительно хорошие решения.
Однако можно ли было бы расширить класс, который возвращает form_for (не уверен, какой именно, FormHelper или FormBuilder?), Чтобы иметь возможность делать это в представлении:
<%= form_for(@myObj) do |f| %>
<%= f.select_duration :duration %>
<% end %>
Я начал искать в Google, как расширить помощник формы, но пока не мог понять.
UPDATE2: я не могу ответить на свой собственный вопрос, поэтому я разместил его здесь.
Наконец-то понял, как это сделать. Создал файл form_helper.rb в app / helpers и расширил FormBuilder следующим кодом:
module FormHelper
def self.included(base)
ActionView::Helpers::FormBuilder.instance_eval do
include FormBuilderMethods
end
end
DURATIONS = [["5 Minutes", 5], ["15 minutes", 15], ["30 minutes", 30],["1 hour", 60]]
module FormBuilderMethods
def select_duration(method)
@template.select @object_name, method, @template.options_for_select(DURATIONS, @object.reminderTimeMinutes ? DURATIONS[@object.reminderTimeMinutes] : DURATIONS[0])
end
end
end
Последнее, в чем я не уверен, это правильное ли это место для константы ДЛИТЕЛЬНОСТИ (я совсем новичок в ruby и ruby on rails).
Комментарии:
1. Как объяснено в моем ответе, определения длительностей содержатся в файле .rb (с именем по вашему выбору) в приложении / инициализаторах. кстати, немного дерзко брать основную часть моего ответа, но не отмечать мой как ответ.
2. Поправьте меня, если я неправильно понял ваше требование. Но выбранный вами подход немного сложен, когда вы можете сделать то же самое очень простым способом, как указано ниже в моем ответе. Помните принцип KISS
Ответ №1:
Создайте файл .rb в app / initializers, который создает ваши параметры в виде массива
DURATIONS = [["5 Minutes", 5], ["15 minutes", 15], ["30 minutes", 30],["1 hour", 60]]
Затем в _forms, в которых вы хотите использовать эти параметры,
<div class="field">
<b>Choose a duration</b><br />
<%= f.select :duration, options_for_select(DURATIONS, @my_table.duration ? DURATIONS[@my_table.duration] : DURATIONS[0]) %>
</div>
Удачи.
Ответ №2:
Просто перейдите через select_tag или collection_select
select_tag 'meeting', 'time', ['5 min', '15 min', '30min']`
Если вы хотите повторно использовать тег, добавьте его в качестве вспомогательной функции в вспомогательный файл приложения `
def my_dropdown
select_tag(same as above
end
при просмотре файла просто вызовите <%= my_dropdown%>
Комментарии:
1. Да, я согласен, у нас есть стандарт, согласно которому помощники представления всегда помещаются в качестве вспомогательных модулей, в отличие от, скажем, методов модели, которые мы пытаемся зарезервировать для бизнес-логики, которую мы также хотим сохранить вне контроллера.