2009-10-18 51 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