2012-01-31 75 views
0

我想使用填充select標籤的Ruby/Rails

((0..10).to_a.collect {|r| ["#{r*10} %", r*10] }) 

會給結構像

[["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]] 

我不知道這種結構可以轉換爲以下選擇標籤

<select> 
<option value=10> 10% </option> 
<option value=20> 20% </option> 
<option value=30> 30% </option> 
</select> 

像這樣的東西

[#<ratio id: 10, name: "10%">, #<id: 20, name:"20%">] 

如何第一結構轉變爲第二晶格結構

所以我可以使用

options_from_collection_for_select(@arr,"id","name") 

填充select_tag 或

有沒有更好的辦法做?

評論請。

回答

3

您可以嘗試使用OpenStruct

OpenStruct是一種類似於哈希的數據結構,它允許定義任意屬性及其伴隨的值的 。 這是通過使用Ruby的元編程來定義類本身的方法 。

require 'ostruct' 
(0..10).map { |i| OpenStruct.new(:id => i*10, :name => "#{i*10}%") } 
# => [#<OpenStruct id=0, name="0%">, #<OpenStruct id=10, name="10%">, ... 

但是如果你需要一個真正的類,而不是匿名類像OpenStruct,那麼只需要創建一個收集/映射方法在這裏面的類實例:

class Ratio 
    attr_reader :id, :name 
    def initialize(id, name) 
     @id = id; @name = name 
    end 
end 
(0..10).map { |i| ratio = i*10; Ratio.new(ratio, "#{ratio}%") } 
# => [#<Ratio: @id=0, @name="0%">, #<Ratio: @id=10, @name="10%">, ... 

也許我誤會你了了一下,你想從範圍內不會產生這種結構,但是從陣列[["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]]那麼代碼是相似的:

require 'ostruct' 
arr = [["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]] 
p arr.map { |name, id| OpenStruct.new(:id => id, :name => name) } 
# => [#<OpenStruct id=0, name="0 %">, #<OpenStruct id=10, name="10 %">, #<OpenStruct id=20, name="20 %">, #<OpenStruct id=30, name="30 %">] 

UPDATE 我發現OpenStruct的使用一個角落的情況下(貌似這是情況的Ruby 1.8.7只):OpenStruct#id將返回object_idid而不是字段值:

ruby-1.8.7-p352 > o = OpenStruct.new :id => 10 
=> #<OpenStruct id=10> 
ruby-1.8.7-p352 > o.id 
(irb):4: warning: Object#id will be deprecated; use Object#object_id 
=> 70021843187380 

有兩種解決方法:

# 1. redefine OpenStruct#id method: 
OpenStruct.__send__(:define_method, :id) { @table[:id] } 

# 2. dont use 'id' as a value and use any other value: 
require 'ostruct' 
(0..10).map { |i| OpenStruct.new(:value => i*10, :name => "#{i*10}%") } # 'value' instead of 'id' 

... 
options_from_collection_for_select(@arr, 'value', 'name') 

我建議你使用第二種方法。

+0

thnx亞歷克斯..也可以建議一些書或參考開始數據結構和紅寶石元編程..這將是非常有益的。我目前正在研究一些rails項目,並且經常需要使用上面的結構。 – 2012-01-31 12:47:20

+0

@mashit,在我看來,最好的地方是基礎類庫[ruby-doc.org](http://ruby-doc.org/core-1.9.3/)。如果你想深入研究ruby,我可以推薦Matz的Ruby編程語言*。爲了更深入的元編程理解,您可以檢查Perotta的書* Metaprogramming Ruby *。 – 2012-01-31 12:52:50

+0

是的,我需要(你的第二個回覆) – 2012-01-31 12:59:28

1
array = [["0 %", 0], ["10 %", 10], ["20 %", 20], ["30 %", 30]] 
@arr = array.collect { |sub_array| Ratio.new(:id=>sub_array.last, :name=>sub_array.first) } 
+0

我沒有跟隨課程。即我不使用比率類 – 2012-01-31 13:07:34

+0

朋友我以爲你正在使用Ratio類.Okay沒有問題:) – 2012-01-31 13:16:28

+0

以及thnx任何方式 – 2012-01-31 13:22:33