2016-05-19 2 views
0

У меня есть collection_select выпадающий список, который имеет выпадающий список имен, как это:Настройка текста в collection_select выпадающего меню

<%= f.collection_select(:person_id, Person.all, :id, :name) %> 

Но у меня есть внешний ключ на человека, который указывает на группу они являются частью. В раскрывающемся списке я хочу, чтобы показать имена людей и группы рядом с ними, как это:

Пол (Golfers) Кевин (матросам)

и т.д ...

Возможно ли это с помощью collection_select ?

+0

Я думаю, что если вы используете строчную интерполяцию типа «# {: name) (# {id.group}), то вы можете. – myself

ответ

3

Это на самом деле довольно просто сделать. Вам просто нужно написать метод на модели, которую вы вытаскиваете, из которой форматируется строка, которую вы хотите в раскрывающемся списке. Так, из documentation:

class Post < ActiveRecord::Base 
    belongs_to :author 
end 

class Author < ActiveRecord::Base 
    has_many :posts 

    def name_with_initial 
    "#{first_name.first}. #{last_name}" 
    end 
end 

Тогда в вашем collection_select просто вызвать этот метод вместо вызова имени, или то, что вы должны были показать раньше.

collection_select(:post, :author_id, Author.all, :id, :name_with_initial) 

Кажется довольно очевидным в ретроспективе.

+0

Есть ли способ, чтобы выпадающий список был заполнен текущим автором, связанным с этим сообщением? Я пробовал: выбран без успеха. –

+0

Если вы используете form_for form builder, он должен автоматически заполнить значение, уже имеющееся в базе данных, когда оно отображается в окне обновления/редактирования. Вы захотите использовать form_for: post {| f | f.collection_select ...} – Arel

+0

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

0

Вы пробовали:

<%= f.collection_select(:person_id, Person.all.collect { |p| ["#{p.name}(#{p.group})", p.id ] }) %> 
+0

Да, просто попробовал. Получение ошибки: неправильное количество аргументов (задано 2, ожидается 4..6) – Arel