2009-10-18 30 views
0

我在查找如何爲綁定到acts_as_tree對象的單選按鈕列表創建自定義表單生成器的示例。我已經有了顯示單選按鈕列表的代碼,但是想通過重構爲一個formbuilder來幹起來。我無法找到單選按鈕列表的自定義表單生成器的任何示例。用於單選按鈕列表的rails自定義formbuilder示例

任何指針/鏈接,將不勝感激。

回答

2

假設您經常從許多不同的視圖調用此模型上的form_for,並且每個表單都將具有相同的一組單選按鈕。有幾條路線可以帶到這裏。但是,我不知道您是在問如何自動添加單選按鈕列表或只是將其濃縮。

自動添加單選按鈕列表需要更多關於ActionView內部的知識,而不是我可以共享的知識。基本上,你會想弄清楚事情是如何呈現的,並重寫ActionView :: Helpers :: FormHelper中的fields_for方法才能正常工作。不幸的是FormBuilders不能這樣工作。所以它會比它的價值更麻煩。

更好的方法是創建一個方法,在您的自定義表單構建器中生成所有單選按鈕。爲了在發生變化時保持簡單,我們將爲模型添加一個常量。我已經任意決定它將是一個散列,其中每個鍵都是您想要用表單中的單選按鈕列表表示的屬性方法,並且每個值都是該屬性的可接受值的列表。這使得生成多個單選按鈕列表變得非常簡單,而無需更改表單構建器。附:您還可以使用散列來驗證與單選按鈕關聯的任何屬性的內容。

/app/models/example.rb

class Example < ActiveRecord::Base 
    ... 
    RADIO_BUTTON_HASH = { 
    :attribute_a => [:accepted_value_a1, :accepted_value_a2, :accepted_value_a3], 
    :attribute_b => [:accepted_value_b1, :accepted_value_b2], 
    ... 
    } 


    def self.radio_buttons_sort(a,b) 
    # sort method to ensure that multiple radio buttons lists appear in the order you want 
    end 

    def self.radio_buttons_sorted 
    RADIO_BUTTON_HASH.sort{|a,b| radio_button_sort(a,b)} 
    end 
    ... 
end 

我增加了幾個,除了哈希方便的方法,他們不是必要的,但它們提供標準化輸出的清潔方法。

** /應用程序/助手/ example_helper.rb 模塊ExampleHelper

# the custom FormBuilder 
    class ExampleFormBuilder < ActionView::Helpers::FormBuilder  

    # add onkeypress and set maxlength of field to 3 to all text fields 
    def radio_button_list(options={}) 
     Example.sorted_radio_buttons.each do |method,values| 
     values.each do |value| 
      radio_button(method, value, options) 
     end 
     end 
    end 

    end 
end 

然後從那裏被包括ExampleHelper的視圖(默認情況下在由實施例控制器呈現的任何視圖完成)。

<%form_for @example, :builder => ExampleFormBuilder do |f| %> 
    ... 

    <%=f.radio_button_list %> 
<%end%> 
+0

感謝您的回覆。我花了幾個小時試圖通過通過rails helper解決問題,最終得到了一個類似的解決方案。 – Damian 2009-10-19 08:17:57

+0

是的,官方文檔對這個主題不是很有幫助。簡短版本是您使用自定義FormBuilder用您的選項覆蓋FormHelper方法,或創建新的幫助器方法。 – EmFi 2009-10-19 09:12:17