2015-11-17 38 views
1

我有一個形式的下列:顯示文本表示導軌

<div class="col-sm-2 form-group"> 
    <%= f.label :from_age, "From Age" %><br> 
    <%= f.select :from_age, [*-1..65], {}, class: "form-control" %> 
</div> 
<div class="col-sm-2 form-group"> 
    <%= f.label :to_age, "To Age" %><br> 
    <%= f.select :to_age, [*-1..65] << 1000, {}, class: "form-control" %> 
</div> 

換句話說:

對於from_age,用戶選擇之間的年齡數字-1到65. -1代表「全部」的概念。

對於to_age,用戶選擇數字-1到65之間的年齡,也可以選擇數字1000. -1代表「全部」的概念,1000代表「和上」的概念。

隨着from_ageto_age規定,該應用程序現在可以說:

  • 一個機構提供All時代
  • 一個機構提供一個年齡的人18 and up
  • 年齡25-40的代理服務的個人的個人

創建新代理時,上面的代碼w orks ok,但用戶需要知道值-1代表up,而值1000代表值and up

我可以做得更好。我只需要在選擇框中顯示錶示值的文本,因此在選擇框內:而不是看到-1用戶看到:All,而不是1000用戶看到:and up

我有我的Agency模型如下:

def from_age_to_s 
    if from_age == -1 
    return "All" 
    else 
    return from_age 
    end 
end 

def to_age_to_s 
    case to_age 
    when -1 
    "All" 
    when 1000 
    "+up" 
    else 
    to_age 
    end 
end 

所以基本上我需要告訴的形式:「是的,這些都是價值觀和正確的,但對於那些值顯示的文本,利用這些方法,表示打通的形式傳遞這些價值的文本。

Documentation on select form helper。在這種情況下

也許是更好地使用collection_select

更新

多虧了下面的答案提供幫助。這裏是我的from_age解決方案:

<div class="col-sm-2 form-group"> 
    <%= f.label :from_age, "From Age" %><br> 
    <%= f.select :from_age, options_for_from_date, {}, class: "form-control" %> 
</div> 

# helpers/application_helper.rb 
def options_for_agencies_from_date 
    [ [ 'All', -1 ], *0..65] 
end 

def options_for_agencies_to_date 
    [ [ 'All', -1 ], *0..65, [ '+up', 1000 ] ] 
end 
+0

不要做'[* -1..65]'。 Range對象響應'map';你不需要先將它轉換成一個數組。只要做'(-1..65).map'。 (如果你想將Range轉換爲數組,只需使用'.to_a',即'(-1..65).to_a')。 –

+1

我已經更新了我的答案並略有改進:您不需要執行'[num,num]'事情。 –

+0

@Jordan超級光滑!我更新了問題中的更新。謝謝!! – Neil

回答

1

您可以通過像[ [ 'Label 1', 'value 1' ], [ 'Label 2', 'value 2' ], ... ]數組select,這將導致這樣的選擇:

<option value="value 1">Label 1</option> 
<option value="value 2">Label 2</option> 
... 

但也有可以使用快捷方式:並不是每一個選項數組中的元素必須是上面的[ label, value ]數組。對於不是數組的元素,select將僅爲標籤和值使用該值。換句話說,如果我們這樣做:

choices = [ [ 'Foo', 1 ], 2, 3, [ 'Bar', 4 ] ] 

...然後select將呈現這樣的選擇:

<option value="1">Foo</option> 
<option value="2">2</option> 
<option value="3">3</option> 
<option value="4">Bar</option> 

有了這些知識,我們就可以生成與標籤和值,我們的數組希望(你可能會希望把它恆定在控制器的頂部,它只是計算一次):

class MyController < ApplicationController 
    AGE_CHOICES = [ [ 'All', -1 ], *0..65, [ '+up', 1000 ] ] 

    # ... 
end 

puts MyController::AGE_CHOICES 
# => [ [ 'All', -1 ], 
#  0, 
#  1, 
#  ... 
#  65, 
#  [ '+up', 1000 ] ] 

現在,在你看來,你可以只是這樣做:

<%= f.select :from_age, MyController::AGE_CHOICES, {}, class: "form-control" %> 

...這會使這樣的事情:

<option value="-1">All</option> 
<option value="0">0</option> 
<option value="1">1</option> 
... 
<option value="1000">+up</option>