2012-02-20 52 views
1

我試圖使用Hash對象等爲ActiveRecord的型號中表單助手:表單助手和Hash的型號爲

<% hash = { :some_key => 'some_value' } %> 

<% fields_for "hash", hash do |f| %> 

    <%= f.text_field :some_key %> 

<% end %> 

據我所知,它試圖撥打:some_key方法哈希對象。我試圖重寫哈希類的'發送'方法,但沒有運氣:

def send(symbol, args = []) 
    if self.has_key?(symbol) 
    self[ symbol ] 
    elsif self.has_key?(symbol.to_s) 
    self[ symbol.to_s ] 
    else 
    super 
    end 
end 

你有什麼想法我怎麼能用這個?

感謝您的幫助。

+0

您正在尋找與符號密鑰的哈希,一個字符串。這是行不通的。但我不確定這是一個好主意,儘管我不能指出爲什麼...... – Chowlett 2012-02-20 16:47:36

+0

啊......你是對的。那是我的錯。那是因爲我確定我的鑰匙是字符串。也改變了例子。謝謝 – ABrukish 2012-02-20 17:00:13

+1

您是否考慮過使用['OpenStruct'](http://www.ruby-doc.org/stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html)或['Struct'](http:///www.ruby-doc.org/core-1.9.3/Struct.html)而不是'Hash'? – 2012-02-20 17:41:57

回答

2

非常感謝KL-7他的OpenStruct的主張。所以,如果有人需要這個,我在這裏添加完整的工作示例。

class Model < ActiveRecord::Base 

    HASH_ATTRIBUTE_DEFAULT = { 
    :value => '', 
    :selected => 0 
    } 

    serialize :hash_attribute, Hash 

    def hash_attribute 
    read_attribute(:hash_attribute) || HASH_ATTRIBUTE_DEFAULT 
    end 

    def hash_attribute=(hash) 
    write_attribute(:hash_attribute, hash) unless hash.nil? 
    end 

end 

現在是時候爲OpenStruct:

<% fields_for "model[hash_attribute]", OpenStruct.new(@model.hash_attribute) do |f| %> 

    <%= f.text_field :value %> 
    <%= f.check_box :selected %> 

<% end %>