2012-05-14 119 views
1

我試圖使用哈希顯示錶單動態分配的字段類型:Rails的:從哈希

PREFIX_STR = "Prefix" 
FIRST_STR = "First Name" 

NEW_USER_HASH = Hash.new 
NEW_USER_HASH[ "prefix" ] = { "label" => PREFIX_STR, "type" => "text_field" } 
NEW_USER_HASH[ "first" ] = { "label" => FIRST_STR, "type" => "text_field" } 

而在new.html.erb,我有:

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %> 
    <%= devise_error_messages! %> 

    <% NEW_USER_HASH.each do |column_name,field_info| %> 
    <div class="field"> 
     <%= f.label field_info["label"] %> 
     <%= f.text_field column_name %> 
    </div> 
    <% end %> 

這工作正常,但而不是f.text_field,我希望這是什麼在field_info [「類型」]。沒有什麼我嘗試過。有任何想法嗎?

謝謝

回答

1

你可以試試f.send(field_into["type"], column_name)

(編輯刪除「to_sym」,其中一個評論者告訴我是不必要的(我想send所需的符號)

爲什麼這個工程:。some_object.send("hello")是簡單地寫some_object.hello的另一種方式在Ruby中,調用「方法「實際上是一種消息傳遞的形式 - 您向該對象發送消息,並且該對象將其解釋爲方法調用(或者不會 - 使用ruby元編程,看起來像方法調用不需要)

在這種情況下,您有一個對象f,它代表form_helper對象,因此當您撥打f.text_field時,您正在向該對象發送消息。通過使用f.send,您可以做同樣的事情,但可以動態生成該消息的內容。

+0

'send'也適用於字符串。 – x1a4

+0

這似乎工作(我看到的形式,但仍然需要測試它)。我不明白它爲什麼還能起作用,但我有一些事情要做。 –

+0

編輯刪除to_sym,並添加它爲什麼工作原因的解釋。 –