2015-07-03 2 views
0

У меня есть простой помощникрельсы помощник внутри collection_select

def get_ecr_name(name) 
    name.present? ? :name : :ip 
end 

хотите использовать в коллекции выберите

=f.collection_select(:ecr_id, current_user.ecrs, :id, get_ecr_name(@ecr.name), :prompt => 'Select ECR') 

, но проблема, если ККМ не назвать другие выбора параметров пустые enter image description here

+0

Что происходит, когда вы смените 'get_ecr_name (name, ip) 'и вызывается как' get_ecr_name (@ ecr.name, @ ecr.ip) '? – Pavan

+0

@Pavan он возвращает мне список ip-адресов, моя цель - когда нет имени show ip в меню выбора – xxx

ответ

0

Поскольку collection_select вызовет ваш вспомогательный метод один раз с @ecr.name (где name присутствует), он возвращает :name и, следовательно, name. Одним из способов преодоления этой ситуации заключается в создании другой переменной объекта массива в контроллере так:

@ecrs = current_user.ecrs.map{|ecr| (ecr.name = ecr.name.present? ? ecr.name : ecr.ip); ecr } # returns a temporary modified ecrs array. 

затем использовать его на ваш взгляд:

= f.collection_select(:ecr_id, @ecrs, :id, :name, :prompt => 'Select ECR') 
1

Те заготовки выберите вариант содержит идентификатор так

для ид вы пишете другой помощник

def get_ecr_id(id,name) 
    return id if name.present? 
end 

затем повторно написать

=f.collection_select(:ecr_id, current_user.ecrs, get_ecr_id(@ecr.id,@ecr.name), get_ecr_name(@ecr.name), :prompt => 'Select ECR') 
0

Проверить на него, есть вариант для options_from_collection_for_select

<%= f.select :ecr_id, options_from_collection_for_select(get_ecr_name(@ecr)).name, 'id', 'name') %> 
0

Спасибо за help.I переделать на f.select основе вашего anwers

=f.select('ecr_id', current_user.ecrs.collect {|p|[get_ecr_name(p.name,p.ip),p.id] }, { prompt: 'Select Ecr' }) 
Смежные вопросы