用于radiobutton列表的rails custom formbuilder的示例

我正在寻找一个示例,说明如何为绑定到acts_as_tree对象的单选按钮列表创建自定义表单构建器。 我已经有代码显示单选按钮列表,但想通过重构为formbuilder来干掉它。 我找不到任何单选按钮列表的自定义表单构建器的示例。

任何指针/链接将不胜感激。

假设您经常从许多不同的视图调用此模型上的form_for,并且每个表单都将具有相同的单选按钮集。 您可以在这里找到几条路线。 但是,我不知道你是否在询问如何自动添加单选按钮列表或者只是压缩它。

自动添加单选按钮列表需要比我可以分享更多的ActionView内部知识。 基本上你会想弄清楚事物的呈现方式,并覆盖ActionView :: Helpers :: FormHelper中的fields_for方法才能正常工作。 不幸的是,FormBuilders不会那样工作。 所以它会比它的价值更麻烦。

更好的方法是创建一个方法,在自定义表单构建器中生成所有单选按钮。 为了在发生变化时保持简单,我们将为模型添加一个常量。 我已经随意决定它将是一个散列,其中每个键是一个属性方法,你想用表单中的单选按钮列表来表示,每个值都是该属性的可接受值列表。 这使得生成多个单选按钮列表变得简单,而无需更改表单构建器。 PS您还可以使用哈希来validation与单选按钮关联的任何属性的内容。

/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 

除了哈希之外,我还添加了一些便利方法,它们不是必需的,但它们提供了一种更简洁的输出标准化方法。

** / app / helpers / 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的视图(默认情况下在Example控制器呈现的任何视图中完成)。

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