Создать многоразовый выпадающий список с Rails

#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. Да, я согласен, у нас есть стандарт, согласно которому помощники представления всегда помещаются в качестве вспомогательных модулей, в отличие от, скажем, методов модели, которые мы пытаемся зарезервировать для бизнес-логики, которую мы также хотим сохранить вне контроллера.