Как заполнить поле выбора rails simple_form, используя индекс? - PullRequest
3 голосов
/ 17 января 2012

надеюсь, это не так уж сложно ..

Итак, у меня есть модель с множеством атрибутов, которую я решил сохранить в качестве индексов в базе данных, которые ссылаются на константу в модели:

class Profile < ActiveRecord::Base
   STATUS_CHOICES = %w( single relationship married divorced complicated open )
   etc...

В моей форме, я делаю это прямо сейчас:

= f.simple_fields_for :profile do |p|
  = dp.input :relationship_status, :required => true, :collection => Datingprofile::STATUS_CHOICES

Это показывает коллекцию очень хорошо, но, конечно, значение должно быть установлено из индекса, поступающего из модели. Как бы я установить значения в коллекции, чтобы соответствовать правильный индекс массива STATUS_CHOICES?

Обновление: собирается изменить архитектуру, чтобы сделать перечисленные атрибуты действительными объектами AD

Ответы [ 4 ]

6 голосов
/ 27 января 2015

модель

какой-то постоянный хеш:

HASH_NAME = {
 0 => "Choose:",
1 => "On-Campus Recruiting - CSO",·
2 => "CSO Staff Referral",
3 => "Faculty Contact",·
4 => "Career Day",·
5 => "CSO Summer Job Listing",·
6 => "Alumni Contact",·
7 => "Personal Contact",·
8 => "Other"·
}

- просмотр

<%= f.input :some_field, :collection => Model::HASH_NAME.sort.map {|k,v| [v,k]} %>

Это выдает хороший выбор с помощью выбора-значить как хеш-ключ и выбрать имя как хеш-значение, например:

<select id="form_application_job_source" class="select required" name="form_application[job_source]">
<option value="0">Choose:</option>
<option value="1">On-Campus Recruiting - CSO</option>
<option value="2">CSO Staff Referral</option>
<option value="3">Faculty Contact</option>
<option value="4">Career Day</option>
<option value="5">CSO Summer Job Listing</option>
<option value="6">Alumni Contact</option>
<option selected="selected" value="7">Personal Contact</option>
<option value="8">Other</option>
</select>

Теперь, если из выпадающего списка выбрать «Рекрутинг в кампусе - CSO», будет сохранено значение: 1

Чтобы отобразить его в виде «Рекрутинг на кампусе - CSO», вам нужно создать небольшую функцию возврата, как в самой модели:

def return_paper_type
    HASH_NAME[id]
  end

Ввид, это было бы так: <%= @instancevariable.return_paper_type %>

2 голосов
/ 21 января 2013

Одним из способов быстрого решения этой проблемы было бы сделать коллекцию перечислимыми индексами для значений элемента option, а затем использовать массив STATUS_CHOICES для получения меток с помощью: label_method.

= f.simple_fields_for :profile do |p|
  = dp.input :relationship_status, :required => true, :collection =>  0..Datingprofile::STATUS_CHOICES.length, :label_method => lambda { |i| Datingprofile::STATUS_CHOICES[i] }

Ссылки:

https://github.com/plataformatec/simple_form#collections https://github.com/plataformatec/simple_form/blob/master/test/inputs/collection_select_input_test.rb#L141

0 голосов
/ 02 июля 2014

Добавьте эту строку в Gemfile вашего приложения:

gem 'enum_help'

И затем выполнить:

$ bundle

В модели

class Profile < ActiveRecord::Base
   enum relationship_status:{single: 0,relationship:1, married:2, divorced:3, complicated:4, open:5}
   etc...

В _form.html.erb используя simple_form:

<%= f.input :relationship_status %>

Для получения дополнительной информации: https://github.com/zmbacker/enum_help

0 голосов
/ 18 января 2012

Решили реализовать эту константу хешей вместо массивов, что обеспечивает простоту одной модели без сложности работы с индексами. Я буду хранить хеш-ключи и использовать значения только в представлении.

Whee !!

...