2015-07-03 34 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') 

但問題如果ECR沒有指定其他選擇的選項都是空enter image description here

+0

當您更改到'get_ecr_name會發生什麼(name,ip)'並且調用爲'get_ecr_name(@ ecr.name,@ ecr.ip)'? – Pavan

+0

@Pavan它返回給我的IP列表,我的目標是當沒有名字在選擇菜單中顯示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

那些空白選擇選項包含的ID,這樣

的ID你寫另一個幫手

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' })