хотите, чтобы rails simple_form включал переключатель для отображения текста, который не является значением - PullRequest
12 голосов
/ 21 сентября 2011

Я использую гем simple_form https://github.com/plataformatec/simple_form для создания некоторых полей ввода; одна из которых представляет собой группу переключателей, например:

<%= f.input :due_date, :collection => ['Today', 'Tomorrow', 'In 3 Days'], :as => :radio %>

Таким образом, это поле в базе данных "due_date" является датой. Но вместо того, чтобы позволить людям нажимать на этот маленький календарь, мы знаем, что обычно люди просто хотят эти три варианта. И я хочу использовать радио кнопку. Но выходные данные этой строки предполагают, что, если я нажму кнопку отправки сейчас, параметр due_date будет иметь значения, указанные там, то есть сегодня, завтра или через 3 дня. Вот выходной HTML для сегодняшней части.

<span>
<input class="radio optional" id="project_due_date_today" name="project[due_date]" type="radio" value="Today">
<label class="collection_radio" for="project_due_date_today">Today</label>
</span>

В идеале я хочу:

<%= f.input :due_date, :collection_to_params => [Date.today, Date.tomorrow, Date.today+3], :display_value => ['Today', 'Tomorrow', 'In 3 Days'], :as => :radio %>

Поэтому, когда пользователь нажимает на него и отправляет, я фактически получаю некоторую дату ISO на сервер.

Есть идеи?

Спасибо!

Ответы [ 2 ]

31 голосов
/ 21 сентября 2011
<%= f.input :due_date, 
:collection => [[Date.today, 'Today'], [Date.tomorrow, 'Tomorrow'], [Date.today+3, 'In 3 Days']], 
:label_method => :last, 
:value_method => :first, 
:as => :radio_buttons %>

Таким образом, вы можете передать либо массив массивов в хэш коллекции, и затем есть еще две опции, которые можно передать, чтобы указать ЗНАЧЕНИЕ этого ввода и видимую метку этого ввода, и они правильно называются label_method и value_method. метод слова означает, какой метод вызывать для отдельного элемента рассматриваемой коллекции, чтобы получить метку или значение. В случае массива array.first - это мое значение, array.last - моя метка. Отсюда и код выше

2 голосов
/ 18 апреля 2016

Это то, что я получил из ответа Nik So со всеми примененными комментариями:

<%= f.input :due_date, 
collection: [['Today', Date.today], ['Tomorrow', Date.tomorrow], ['In 3 Days', Date.today+3]],
as: :radio_buttons %>
...